使用Mockito从void方法中嗅探出对象



我有一个方法要测试,让它变得简单:

public void someMethod(SomeObject object) {
    StringBuffer sb = new StringBuffer();
    sb.append("SOMETHING ").append("ELSE");
    object.setSomething(sb.toString());
}

目前,我对方法setSomething()是否正确工作并不感兴趣。相反,我想看看sb.toString()是否返回了什么。

有没有办法用Mockito访问StringBuffer sb对象?

您可以基于mock进行简单的验证。

创建mock,invoke方法,验证mock已被给定参数调用多次。

@Test
public void doTest() {
    //Setup mock
    SomeObject mock = mock(SomeObject.class);
    //Call method
    someMethod(mock);
    //Verify
    verify(mock, times(1)).setSomething("SOMETHING ELSE");
}

也有人认为,将测试中的方法重构为类似的方法

public String someMethod() {
    StringBuffer sb = new StringBuffer();
    sb.append("SOMETHING ").append("ELSE");
    return sb.toString();
}

并且该方法的测试(附加/合并字符串)将更容易测试,而无需模拟任何内容。

测试如下:

@Test
public void doTest() {
    //Call method
    String result = someMethod();
    assertEquals("SOMETHING ELSE", result);
}

除非将StringBuffer作为参数传入,否则无法直接访问StringBuffer。但是您可以使用一个参数捕获器和一个模拟对象来查看调用object.setSomething()的值。

ArgumentCaptor<String> arg = ArgumentCaptor.forClass(String.class);
Object object = mock(Object.class);
someMethod(object)
verify(object).setSomething(arg.capture());
assertEquals("some string", arg.getValue());

参见https://rwehner.wordpress.com/2010/02/23/mockito-some-useful-programming-examples/

使用Mockito的间谍功能,我们只能模拟我们想要的真实对象的那些方法,从而保留原始行为的其余部分。

 @Spy
 SomeObject obj =new SomeObject();
 @Test
public void shouldReturnSomething(){
        someMethod(obj);//calling someMethod
        assertEquals(obj.getSomething(), "SOMETHING ELSE"); //assuming SomeObject has getter method
    }

相关内容

  • 没有找到相关文章

最新更新