1

我想验证对模拟的调用只会发生在某些预期的参数值上,而不会发生在其他任何事情上。

public interface ADependancy {
    public void method(String parameter, String otherParameter);
}


public class Foo {
    private ADependancy myHelper;

    public Foo(ADependancy helper) {
        this.myHelper = helper;
    }

    public void good() {
        myHelper.method("expected","expected");
        myHelper.method("expected","expected");
        myHelper.method("expected","expected");
    }

    public void bad() {
        myHelper.method("expected","expected");
        myHelper.method("expected","UNexpected");
        myHelper.method("expected","expected");
    }
}

我试过这个:

public class FooTest extends TestCase {
    private ADependancy mock =mock(ADependancy.class);;
    private Foo foo  = new Foo(mock);

    @Test
    public void testGood() {
        foo.good();
        validateOnlyCalledWithExpected();
    }

    @Test
    public void testBad() {
        foo.bad();
        validateOnlyCalledWithExpected();
    }

    private void validateOnlyCalledWithExpected() {
        verify(mock,atLeastOnce()).method(eq("expected"),eq("expected"));
        verify(mock,never()).method(not(eq("expected")),not(eq("expected")));
    }
}

期望 testBad 失败,但测试通过了。如果方法只接受一个参数,这将按预期工作。

4

2 回答 2

4

您可以使用http://docs.mockito.googlecode.com/hg/latest/org/mockito/Mockito.html#finding_redundant_invocationsverifyNoMoreInteractions中记录的静态方法。

verify(mock).method(eq("expected"),eq("expected"));
verifyNoMoreInteractions(mock);

或者,你可以写

verify(mock).method(eq("expected"),eq("expected"));
verify(mock,never()).method(anyString(),anyString());

因为第二次调用verify将忽略已经验证的调用。

于 2012-12-24T22:24:16.437 回答
4

这是一个逻辑错误。

我想断言每个参数都只是期望值。但相反,我实际上断言的是,它们都不是预期值的情况永远不会发生。因此,按照我的方式,它并没有按预期失败,因为实际上,某些参数不是预期值,因此永远不会使用所有参数都不是预期值来调用该方法,并且验证通过。

因此,这适用于我想要的:

    private void validateOnlyCalledWithExpected() {
        verify(mock,atLeastOnce()).method(eq("expected"),eq("expected"));
        verify(mock,never()).method(not(eq("expected")),anyString());
        verify(mock,never()).method(anyString(),not(eq("expected")));
    }
于 2012-12-24T17:50:07.150 回答