java 使用Mockito测试void方法的参数

axr492tv  于 2023-05-21  发布在  Java
关注(0)|答案(2)|浏览(101)

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

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

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

dkqlctbz

dkqlctbz1#

也许你想使用doNothing方法。

@Mock
SomeDao someDao;

@Captor
ArgumentCaptor<ObjectX> captor;

@Test
void test() {
    doNothing().when(someDao).boo(captor.capture());
    foo();
    assertEquals("hi", captor.getValue().getField());
}
2ledvvac

2ledvvac2#

更新这是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方法中的一个新Object,要用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"));
}

相关问题