我想使用 Mockito 来测试下面的(简化的)代码。我不知道如何告诉 Mockito 第一次失败,然后第二次成功。
for(int i = 1; i < 3; i++) { String ret = myMock.doTheCall(); if("Success".equals(ret)) { log.write("success"); } else if ( i < 3 ) { log.write("failed, but I'll try again. attempt: " + i); } else { throw new FailedThreeTimesException(); } }
我可以设置成功测试:
Mockito.when(myMock).doTheCall().thenReturn("Success");
和失败测试:
Mockito.when(myMock).doTheCall().thenReturn("you failed");
但是我如何测试它是否失败了一次(或两次)然后成功了,没关系?
从文档:
有时我们需要为同一个方法调用使用不同的返回值/异常存根。典型的用例可能是模拟迭代器。原始版本的 Mockito 没有这个功能来促进简单的模拟。例如,可以使用 Iterable 或简单的集合来代替迭代器。那些提供了自然的存根方式(例如使用真实的集合)。但是,在极少数情况下,存根连续调用可能会很有用: when(mock.someMethod("some arg")) .thenThrow(new RuntimeException()) .thenReturn("foo"); //First call: throws runtime exception: mock.someMethod("some arg"); //Second call: prints "foo" System.out.println(mock.someMethod("some arg"));
有时我们需要为同一个方法调用使用不同的返回值/异常存根。典型的用例可能是模拟迭代器。原始版本的 Mockito 没有这个功能来促进简单的模拟。例如,可以使用 Iterable 或简单的集合来代替迭代器。那些提供了自然的存根方式(例如使用真实的集合)。但是,在极少数情况下,存根连续调用可能会很有用:
when(mock.someMethod("some arg")) .thenThrow(new RuntimeException()) .thenReturn("foo"); //First call: throws runtime exception: mock.someMethod("some arg"); //Second call: prints "foo" System.out.println(mock.someMethod("some arg"));
所以在你的情况下,你会想要:
when(myMock.doTheCall()) .thenReturn("You failed") .thenReturn("Success");