MOCKITO-明确论证绑架者PR



我的问题最好通过一个简单的示例来描述。这是我的班级:

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());        
    }

问题在于,第二个断言失败是因为getValue.getValue()具有从previos呼叫到dofirst的值。我可以在第一次断言之后以某种方式明确争论,以便到第二个时将是无效的?

谢谢。

在我看来,就像您正在测试两个不同的条件-e

  • 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());
    }
}

相关内容

  • 没有找到相关文章