使用Mockito从虚空方法中嗅出物体?

时间:2015-11-17 13:09:05

标签: java junit mockito

我有一种方法可以测试,简化:

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

现在,如果方法setSomething()已正常运行,我并不感兴趣。相反,我想看看sb.toString()返回的是什么。

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

3 个答案:

答案 0 :(得分:3)

您可以根据模拟进行简单的验证。

创建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);
}

答案 1 :(得分:2)

除非您将其作为参数传递,否则无法直接访问StringBuffer。 但你可以使用参数captor和一个模拟对象来查看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/

答案 2 :(得分:0)

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

 @Spy
 SomeObject obj =new SomeObject();

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

    }