SolrPing.Process:此方法的已检查异常无效

时间:2015-09-23 05:19:18

标签: java solr junit mockito solrj

我正在测试solr ping调用的异常条件。这是代码片段。 Solrj版本5.2.0

@Test
public void testPingSolrWhenServerDown2() throws Exception {
  pingSolr = new PingSolr();
  SolrClient mockedSolrClient = Mockito.mock(SolrClient.class);
  SolrPing mockedSolrPing = Mockito.mock(SolrPing.class);
  PowerMockito.whenNew(SolrPing.class).withNoArguments().thenReturn(mockedSolrPing);
  Mockito.doThrow(new IOException()).when(mockedSolrPing).process(mockedSolrClient);
  pingSolr.ping(mockedSolrClient);
}

我收到以下错误:

org.mockito.exceptions.base.MockitoException: 
Checked exception is invalid for this method!
Invalid: java.io.IOException
    at org.apache.solr.client.solrj.request.SolrPing.createResponse(SolrPing.java:36)
    at org.apache.solr.client.solrj.SolrRequest.process(SolrRequest.java:134)
    at org.apache.solr.client.solrj.SolrRequest.process(SolrRequest.java:152)
    at c.i.j.s.i.PingSolrTest.testPingSolrWhenServerDown2(PingSolrTest.java:65)

这就是说IOException是一个无效的已检查异常,但mockito不允许这样做。在另一个测试案例中,SolrServerException也发生了同样的情况。

但是SolrPing.process方法(从SolrRequest扩展)会抛出异常。 SolrRequest.process

我确实注意到createResponse没有抛出任何异常。但当我嘲笑process来电时,为什么会进一步深入调用

2 个答案:

答案 0 :(得分:1)

您尝试模拟的方法

public final T process(SolrClient client, String collection)

标记为finalMockito无法对其进行模拟。请改用PowerMockito来模拟staticfinal的方法。

答案 1 :(得分:0)

我会考虑改变方法。我会将方法调用Solr移动到受保护的方法中,并根据需要使用spy存根。

当然它不如PowerMock真正的交互模拟强大,它需要创建一个包可见的虚拟方法。

但是我们必须与其他测试框架发生冲突,因此我不再需要PowerMock而成为我接受和喜欢的习惯