我有一种方法可以测试,简化:
public void someMethod(SomeObject object) {
StringBuffer sb = new StringBuffer();
sb.append("SOMETHING ").append("ELSE");
object.setSomething(sb.toString());
}
现在,如果方法setSomething()
已正常运行,我并不感兴趣。相反,我想看看sb.toString()
返回的是什么。
有没有办法通过Mockito访问StringBuffer sb
对象?
答案 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
}