用Mockito测试void方法的参数



是否可以测试作为参数传递给使用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"));
}

相关内容

  • 没有找到相关文章