有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Mockito中带有深存根的java IllegalStateException

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

没有参考我的测试代码,但以下是我正在使用的类和测试:

端点。java:使用改进版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);
}

查询。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);
    }
  }

项目数据源测试。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上的一个bug

从我对Mockito代码的轻微挖掘中,我看到在执行测试后收集警告时List被修改


共 (0) 个答案