Java Mockito-清除参数捕获器pr
我的问题最好用一个简单的例子来描述。这是我的班级:Java Mockito-清除参数捕获器pr,java,mockito,Java,Mockito,我的问题最好用一个简单的例子来描述。这是我的班级: public class App { void doFirst(String s){ if(s.equals("hello")){ return; } doSecond(s); } void doSecond(String s){ } } 这是我的测试: public void testApp() { App a =
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());
}
public void testApp(){
App a=spy(新App());
ArgumentCaptor参数=ArgumentCaptor.forClass(String.class);
doNothing().when(a).doSecond(argument.capture());
a、 首先(“再见”);
assertEquals(“bye”,argument.getValue());
a、 首先(“你好”);
assertEquals(null,argument.getValue());
}
问题在于,第二个断言失败,因为eargument.getValue()的值来自于对doFirst的previos调用。我可以在第一个断言之后清除参数吗?这样当它到达第二个断言时它将为空
谢谢。在我看来,您正在测试两种不同的条件-
- 当
不是s
“hello”
- 当
是s
“hello”
参数捕获器
和assertEquals
。这就是验证的目的。您可以这样编写测试类
@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());
}
}
你能不能再创建一个
ArgumentCaptor
?对不起,这对我来说太难了。在本例中,这是看不到的,但在我的实际代码中,第二个结果基于第一个结果,因此它们必须在同一个测试中。假设第一个函数中有一个计数器,每次调用它都会递增,当它>2时,函数返回,否则它会调用doSeconds();但也许您想将第二个verify
更改为verify(toTest,never()).doSecond(“hello”)代码>-只需确保测试方法的名称准确反映您正在测试的条件。不要把它叫做testApp
或testDoSecond
或类似的东西。