我的问题最好通过一个简单的例子来描述。这是我的班级:
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());
}
问题是第二个断言失败,因为argument.getValue()具有来自previos调用doFirst的值。我可以在第一次断言后以某种方式清除参数,因此当它到达第二个时它将为空吗?
谢谢。
答案 0 :(得分:3)
在我看来,你正在测试两种不同的条件 -
doSecond
不是s
"hello"
doSecond
为s
"hello"
未被调用
这应该是两个独立的测试。
另外,请勿使用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());
}
}