基于另一种模拟方法的Mockito模拟方法

时间:2016-12-07 18:25:40

标签: java unit-testing mockito

我们说我有一些服务类

class Service<T> {
  T get(int id);
  void save();
}

在我的单元测试中,我使用mockito模拟了这项服务的两种方法。但是有一种情况是应该基于mocked get方法模拟方法保存。例如,如果使用等于2的参数调用方法get,则方法save应该抛出一些异常。

我浏览了Mockito文档,但似乎还没有找到任何解决方案。

有关Mockito如何实现此用例的任何想法?

2 个答案:

答案 0 :(得分:0)

1)您要做的是从测试用例中调用测试用例。

2)Mocking主要用于测试端点,可能用于控制器。因此,如果您的保存功能需要再次调用,或者您必须将代码重用于其他测试用例,那么您应该这样做,它没有问题。

但是你所说的完全反对模拟测试用例的编程范例。

答案 1 :(得分:0)

在我看来,需要避免这样的嘲弄,但如果你坚持,你可以利用doAnswer()方法进行详细的模拟处理。

基本上,您使用两个Answer个实例。一个用2调用方法时设置标志,另一个重置标志。 另一个答案会对该标志作出反应,并在需要时抛出异常。

private boolean throwExceptionNext;

@Test
public void test() {
    Service mock = Mockito.mock(Service.class);

    Mockito.doAnswer((__) -> {
        throwExceptionNext = false;
        return new Object();
    }).when(mock).get(Mockito.anyInt());
    Mockito.doAnswer((__) -> {
        throwExceptionNext = true;
        return new Object();
    }).when(mock).get(2);

    Mockito.doAnswer((__) -> {
        if (throwExceptionNext)
            throw new RuntimeException();
        return null;
    }).when(mock).save();

    mock.get(3);
    mock.save();
    mock.get(2);
    try {
        mock.save();
        Assert.fail();
    } catch (RuntimeException e) {
    }
    mock.get(3);
    mock.save();

}