我想驗證一次模擬的調用是否只發生在某些期望的參數值上,而不會發生其他任何事情。如何驗證方法只能用期望的參數調用?
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失敗,而是測試通過。如果方法只接受一個參數,則按預期工作。
我更喜歡這個,但它似乎不適用於我的示例。也許這是事實,我不止一次地調用方法? (見「atLeastOnce」); – derekv
好的,然後把'atLeastOnce()'放進去。我沒有打擾,因爲你的問題很清楚你已經知道如何使用'atLeastOnce()'。 –
不,我的意思是,它實際上不起作用,當我插入你的代碼給我的例子,然後_both_測試失敗......進一步檢查確定你的第一個snippit _does_似乎工作正常。這只是第二個snippit不起作用。 – derekv