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
或类似的东西。