是否可以测试作为参数传递给使用Mockito无效方法的实例的值?
public String foo() {
Object o = new ObjectX();
o.setField("hi");
someDao.boo(o);
return "response";
}
boo是void,我想测试foo将字段设置为"hi"
也许你想使用doNothing方法。
@Mock
SomeDao someDao;
@Captor
ArgumentCaptor<ObjectX> captor;
@Test
void test() {
doNothing().when(someDao).boo(captor.capture());
foo();
assertEquals("hi", captor.getValue().getField());
}
已更新这就是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"));
}