我是Mockito的新手。我試圖在我的測試課程中使用Mockito的Answer
界面來測試getAllFoo()
方法的所有分支。我想要isFooComplete()
返回false
前兩次它被調用,然後返回true
第三次,以便actualFoo
包含2個Foo
對象在測試結束。實現Mockito的Answer接口來測試方法的所有分支
的問題是,裏面的for循環在那裏我就打電話service
getAllFoo()
,返回false
第一次,然後測試成爲一個無限循環卡(如你所期望看getAllFoo()
方法實現)。
如何修改這個測試使getAllFoo()
回報false
兩次,然後返回true
和終止循環?
服務類:
public class ServiceImpl {
@Autowired
FooService fooService;
public Collection<Foo> getAllFoo() {
Collection<Foo> allFoo = new ArrayList<>();
boolean complete = fooService.isFooComplete();
boolean available = fooService.isFooAvailable();
while (!complete && available) {
Foo foo = fooService.getAvailableFoo();
allFoo.add(foo);
}
return allFoo;
}
}
測試類:
public class ServiceImplTest {
@InjectMocks
ServiceImpl service = new ServiceImpl();
@Mock
FooService fooService;
class MyAnswer implements Answer<Boolean> {
int counter = 0;
@Override
public Boolean answer(InvocationOnMock inovation)
throws Throwable {
return (counter++ > 2) ? Boolean.TRUE : Boolean.FALSE;
}
}
@Test
public void testGetAllFoo() {
MyAnswer myAnswer = new MyAnswer();
MockFoo mockFoo = new MockFoo();
when(fooService.isFooComplete()).thenAnswer(myAnswer);
//when(fooService.isFooComplete()).thenReturn(false, false, true);
when(fooService.isFooAvailable()).thenReturn(true);
when(fooService.getAvailableFoo()).thenReturn(mockFoo);
Collection<Foo> actualFoo = new ArrayList<>();
for (int i = 0; i < 3; i++) {
actualFoo = service.getAllFoo();
}
assertTrue(actualFoo.contains(mockFoo));
assertEquals(2, actualFoo.size());
}
}
櫃檯上良好的漁獲物。我已經編輯來增加它。 我在我的代碼中最初做了一個錯誤複製:'service.getAllFoo()'應該在循環內部(我也編輯過) - 這就是創建問題的原因:第一次調用返回false,然後卡住在計數器可以遞增到最終返回true的情況下,在無限循環中。 我試着用'thenReturn(false,false,true)'而不是Answer來解決問題,問題仍然存在。任何其他想法? –