Mockito - 明确的论证俘虏pr

时间:2014-01-23 19:37:50

标签: 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 = 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的值。我可以在第一次断言后以某种方式清除参数,因此当它到达第二个时它将为空吗?

谢谢。

1 个答案:

答案 0 :(得分:3)

在我看来,你正在测试两种不同的条件 -

  • doSecond不是s
  • 时,使用正确的参数调用"hello"
  • doSeconds
  • 时,"hello"未被调用

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

另外,请勿使用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());
    }
}