是否可以使用Mockito测试作为参数传递给void的方法的实例的值?
public String foo() {
Object o = new ObjectX();
o.setField("hi");
someDao.boo(o);
return "response";
}
boo无效,我想测试foo将字段设置为“hi”
答案 0 :(得分:-1)
<强>更新强> 这就是我评论中JB的建议。
@RunWith(MockitoJUnitRunner.class)
public class BarTest
{
@Mock
private SomeDao someDao;
@InjectMocks
private Bar bar;
@Before
public void initMocks()
{
MockitoAnnotations.initMocks(this);
}
@Test
public void testFoo()
{
Mockito.doAnswer(new Answer<Object>()
{
@Override
public Object answer(InvocationOnMock invocation) throws Throwable
{
ObjectX x = (ObjectX) invocation.getArguments()[0];
Assert.assertEquals("hi", x.getField());
return null;
}
}).when(someDao).boo(Mockito.any(ObjectX.class));
Assert.assertEquals("response", bar.foo());
}
}
以下是我的第一个答案,并以自己的方式纠正。
不,Mockito是不可能的,因为ObjectX是void方法中的一个新对象,要使用Mockito实现这一点,那么你必须将ObjectX作为参数传递给方法foo()
。如果您的代码无法更改,您可能需要查看Powermock。
public String foo(ObjectX objectX) {
Object o = objectX;
o.setField("hi");
someDao.boo(o);
return "response";
}
测试用例
@Test
public void testFoo()
{
ObjectX mock = Mockito.mock(ObjectX.class);
Assert.assertEquals("response", foo(mock));
Mockito.verify(mock, Mockito.times(1)).setField(Mockito.eq("hi"));
}