Mockito - 清除参数捕获器 PR

3

我的问题可以通过一个简单的例子来描述。这是我的类:

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()的值来自于对doFirst的先前调用。我是否可以在第一个断言后清除argument,以便在到达第二个断言时它将为null?
谢谢。

2
你能否创建另一个 ArgumentCaptor 吗? - Alexander Tokarev
1个回答

4

看起来你在测试两个不同的条件 -

  • s不是"hello"时,doSecond被正确调用的情况
  • s"hello"时,doSecond没有被调用的情况

这应该是两个单独的测试。

此外,不要使用 ArgumentCaptorassertEquals。 这就是 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());
    }
}

抱歉,这对我来说不太适用。在这个例子中,虽然看不到,但在我的实际代码中,第二个结果是基于第一个结果的,因此它们必须在同一个测试中。假设第一个函数中有一个计数器,在每次调用时会增加,当它> 2时,函数将返回,否则它将调用doSeconds()。 - user1985273
1
好的,你可以将它们合并到一个测试中;但是也许你想将第二个 verify 更改为 verify(toTest, never()).doSecond("hello"); - 只要确保测试方法的名称准确反映了你正在测试的条件即可。不要只称其为 testApptestDoSecond 等类似的命名方式。 - Dawood ibn Kareem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接