我和Mockito发生了一个非常奇怪的错误:
java.lang.IllegalStateException
at java.util.LinkedList$ListItr.remove(LinkedList.java:923)
at org.mockito.internal.debugging.WarningsFinder.find(WarningsFinder.java:36)
at org.mockito.internal.debugging.WarningsPrinterImpl.print(WarningsPrinterImpl.java:28)
at org.mockito.internal.debugging.WarningsCollector.getWarnings(WarningsCollector.java:34)
at org.mockito.internal.junit.JUnitRule$1.evaluate(JUnitRule.java:29) <26 internal calls>
没有引用我的测试代码,但这里是我使用的类和测试:
Endpoint.java:使用Retrofit 2.0
public interface Endpoint {
@GET("items/{itemId}")
Call<List<Item>> list(@Path("itemId") String itemId);
Call<List<Item>> list(@Path("itemId") String itemId, @Path("alternativeId") String alternativeId);
}
Query.java
public class Query {
private String itemId;
// constructor, etc
public String getItemId() {
return itemId;
}
}
ItemDataSource.java:未完成的实施(在TDD之后)
public class ItemDataSource {
private Endpoint endpoint;
// constructor, etc
public Optional<Item> get(Query query) {
List<Item> list = null;
try {
list = endpoint.list(query.getItemId()).execute().body();
} catch (IOException e) {
e.printStackTrace();
}
Template result = modelAdapter.apply(list.get(0));
return Optional.ofNullable(result);
}
}
ItemDataSourceTest.java:
public class TemplateNetworkDataSourceTest {
@Rule
public MockitoRule mockitoRule = MockitoJUnit.rule();
@Mock
private Query query;
@Mock
private Item item;
@Mock(answer = RETURNS_DEEP_STUBS)
private ItemEndpoint endpoint;
@Test
public void shouldProvideItemFromEndpoint() throws Exception {
when(query.getItemId()).thenReturn("itemId");
when(endpoint.list("itemId").execute()).thenReturn(Response.success(singletonList(networkTemplate)));
ItemDataSource dataSource = new ItemDataSource(endpoint);
Optional<Item> actual = dataSource.get(query);
assertThat(actual.get()).isEqualTo(item);
}
@Test
public void shouldProvideNoItemsWhenNotFound() throws Exception {
//when(query.getProductId()).thenReturn("incorrect_productId"); // <- works
when(endpoint.list(anyString()).execute()).thenReturn(Response.success(emptyList()));
ItemDataSource dataSource = new ItemDataSource(endpoint);
Optional<Item> actual = dataSource.get(query);
assertThat(actual.isPresent()).isFalse();
}
}
如果我运行它,第一个测试运行正确但第二个测试给出了我提供的错误。如果我在第二次测试的声明中注释掉它的第一行(这可能就是答案),但我想知道我是否遗漏了某些东西,或者这是否是Mockito的错误。
从我对 Mockito 代码的轻微挖掘中,我发现在执行测试后收集警告时会修改List
。