在Mockito中使用深层存根的IllegalStateException

时间:2016-05-04 13:40:29

标签: java mockito

我和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

0 个答案:

没有答案