我有一个方法要测试,让它变得简单:
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
}