我的问题最好通过一个简单的示例来描述。这是我的班级:
public class App
{
void doFirst(String s){
if(s.equals("hello")){
return;
}
doSecond(s);
}
void doSecond(String s){
}
}
这是我的测试:
public void testApp() {
App a = spy(new App());
ArgumentCaptor<String> argument = ArgumentCaptor.forClass(String.class);
doNothing().when(a).doSecond(argument.capture());
a.doFirst("bye");
assertEquals("bye", argument.getValue());
a.doFirst("hello");
assertEquals(null, argument.getValue());
}
问题在于,第二个断言失败是因为getValue.getValue()具有从previos呼叫到dofirst的值。我可以在第一次断言之后以某种方式明确争论,以便到第二个时将是无效的?
谢谢。
在我看来,就像您正在测试两个不同的条件-e
- 当
s
不是"hello"
时, - 当
s
是"hello"
时,
doSecond
被正确参数调用doSecond
不会被调用应该是两个单独的测试。
另外,不要使用ArgumentCaptor
和assertEquals
。这就是verify
的目的。您可以像这样写测试课。
@RunWith(MockitoJUnitRunner.class)
public class AppTest {
@Spy App toTest;
@Test
public void doSecondIsCalledWhenArgumentIsNotHello() {
toTest.doFirst("bye");
verify(toTest).doSecond("bye");
}
@Test
public void doSecondIsNotCalledWhenArgumentIsHello() {
toTest.doFirst("hello");
verify(toTest, never()).doSecond(anyString());
}
}