使用Mockito测试void方法的参数

时间:2014-08-25 16:30:53

标签: java junit mockito

是否可以使用Mockito测试作为参数传递给void的方法的实例的值?

public String foo() {
    Object o = new ObjectX();
    o.setField("hi");
    someDao.boo(o);
    return "response";
}

boo无效,我想测试foo将字段设置为“hi”

1 个答案:

答案 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"));
}