2013-12-12 5 views
10

ゼロの相互作用、私はインターフェイス例外:mockitoはたかったが呼び出されない、実はこのモック

Interface MyInterface { 
    myMethodToBeVerified (String, String); 
} 

を持っており、インタフェースの実装では、私は別のクラスに

class MyClass { 
    MyInterface myObj = new MyClassToBeTested(); 
    public void abc(){ 
     myObj.myMethodToBeVerified (new String(“a”), new String(“b”)); 
    } 
を持って

class MyClassToBeTested implements MyInterface { 
    myMethodToBeVerified(String, String) { 
    ……. 
    } 
} 

ですがありました

}

私はMyClass用のJUnitを作成しようとしています。私は

class MyClassTest { 
    MyClass myClass = new MyClass(); 

    @Mock 
    MyInterface myInterface; 

    testAbc(){ 
     myClass.abc(); 
     verify(myInterface).myMethodToBeVerified(new String(“a”), new String(“b”)); 
    } 
} 

を行っている。しかし、私はmockitoがたかったが呼び出されない、実はこのモックゼロの相互作用が確認するコールであった取得しています。

誰もが解決策を提案することができます。

答えて

10

テストしているクラスの中にモックを注入する必要があります。現時点では、実際のオブジェクトとやりとりしているのではなく、模擬したものとやり取りしています。あなたは次のようにコードを修正することができます

void testAbc(){ 
    myClass.myObj = myInteface; 
    myClass.abc(); 
    verify(myInterface).myMethodToBeVerified(new String(“a”), new String(“b”)); 
} 

@Beforeにすべての初期化コードを抽出するための賢明な選択だろうが、

@Before 
void setUp(){ 
    myClass = new myClass(); 
    myClass.myObj = myInteface; 
} 

@Test 
void testAbc(){ 
    myClass.abc(); 
    verify(myInterface).myMethodToBeVerified(new String(“a”), new String(“b”)); 
} 
+0

下に書くことがありますか? –

+1

@IgorGanapolsky:Mockito.mockを使用すると、myObjに1つのsetterメソッドを使用し、mockedオブジェクトをmyObjに設定する必要があります。 –

3

JK1の答えは罰金ですが、Mockitoもすることができます@注釈を使用して、より簡潔注入:

@InjectMocks MyClass myClass; //@InjectMocks automatically instantiates too 
@Mock MyInterface myInterface 

しかしかかわらず、使用方法、注釈が処理されていない(いなくても、あなたの@Mock)のあなたは何とか静的を呼び出さない限り、 MockitoAnnotation.initMocks()を入力するか、クラスに@RunWith(MockitoJUnitRunner.class)と注釈を付けます。

8

あなたのクラスMyClassは、モックを使用する代わりに、新しいMyClassToBeTestedを作成します。 My article on the Mockito wikiには、これを扱う2つの方法が記載されています。

1

@ jk1 @igor Ganapolskyが尋ねたので、なぜここでMockito.mockを使用できないのですか?私はこの答えを投稿する。

これについては、myobjに1つのセッターメソッドを提供し、myobj値をmockedオブジェクトで設定しました。我々のテストクラスで

class MyClass { 
    MyInterface myObj; 

    public void abc() { 
     myObj.myMethodToBeVerified (new String(“a”), new String(“b”)); 
    } 

    public void setMyObj(MyInterface obj) 
    { 
     this.myObj=obj; 
    } 
} 

、我々はここに** ** Mockito.mockを使用することはできませんなぜコード

class MyClassTest { 

MyClass myClass = new MyClass(); 

    @Mock 
    MyInterface myInterface; 

    @test 
    testAbc() { 
     myclass.setMyObj(myInterface); //it is good to have in @before method 
     myClass.abc(); 
     verify(myInterface).myMethodToBeVerified(new String(“a”), new String(“b”)); 
    } 
}