1

私はverify単体テストが初めてで、Mockito で使用されるメソッドの使用法に関して簡単な質問がありました。これがテストに使用したクラスです。

public class Foo{
int n = 0;
void addFoo(String a){
    if(a == "a")
    add(1);
}

protected void add(int num){
    n =1;
}

public int get(){
    return n;
}

}

そして、これが私の単体テストです。

public class FooTest {
@Mock Foo f;

@Test
public void test() {
    MockitoAnnotations.initMocks(this);
    f.addFoo("a");

    //Passes
    Mockito.verify(f).addFoo("a");

    //Fails
    Mockito.verify(f).add(1);
}

}

そして、私は

   Wanted but not invoked:
f.add(1);
-> at FooTest.test(FooTest.java:22)

However, there were other interactions with this mock:
-> at FooTest.test(FooTest.java:16)

例外。

add(int num)が呼び出されていることをどのように確認しますか?

4

1 に答える 1

3

のポイントを誤解していると思いますverify。テストでFoo fは、 はモック オブジェクトですFoo。 の内部実装は無視され、( を使用してwhen(f.someMethod().thenXXX) 記録した動作のみが発生します。

モックと検証のポイントは、内部実装を無視して相互作用をテストすることです。この例では、おそらく を使用する 別のクラスがあり、指定されたインスタンスFooの正しいメソッドを呼び出すかどうかをテストする必要があります。Foo

簡単な例:

Foo質問で提示したクラスを使用するクラスがあるとします。

public class FooUser {
    private Foo f;

    public void setFoo(Foo f) {
        this.f = f;
    }

    public Foo getFoo() {
        return f;
    }

    public void addToFoo(String string) {
        f.add(string);
    }
}

ここで、次の正しいメソッドをFooUser#addToFoo(String)実際に呼び出すかどうかをテストする必要があります。add(String)Foo

@RunWith (MockitoJUnitRunner.class)
public class FooUserTest {
    @Mock Foo f;
    FooUser fUser;

    @Before
    public void init() {
        fUser = new FooUser();
        fUser.setFoo(f);
    }

    @Test
    public void test() {
        fUser.addToFoo("a");
        Mockito.verify(f).addFoo("a");
    }
于 2013-11-05T06:26:01.447 に答える