我们说我有一些服务类
class Service<T> {
T get(int id);
void save();
}
在我的单元测试中,我使用mockito模拟了这项服务的两种方法。但是有一种情况是应该基于mocked get方法模拟方法保存。例如,如果使用等于2的参数调用方法get,则方法save应该抛出一些异常。
我浏览了Mockito文档,但似乎还没有找到任何解决方案。
有关Mockito如何实现此用例的任何想法?
答案 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();
}