繁体   English   中英

mocking 最终方法的空指针异常

[英]Nullpointer Exception for mocking final method

尝试模拟Aggregations.getAsMap()时出现 NullPointerException

我已经通过使用 PowerMockito.doReturn(map).when(aggs).getAsMap() 尝试了其他不同的方法,但仍然面临同样的问题

@PrepareForTest(Aggregations.class)
public class TestExample extends PowerMockTestCase {

    @Test
    public void testMyMethod() {
        Aggregations aggs = PowerMockito.mock(Aggregations.class);
        Cardinality cardinality = Mockito.mock(Cardinality.class);
        Map<String, Aggregation> map = new HashMap<String, Aggregation>();
        map.put("sample", cardinality);
        Mockito.when(aggs.getAsMap()).thenReturn(map);
    }

}
Mockito.when(aggs.getAsMap()).thenReturn(map);

虽然调试 aggs 值包含以下值

{Aggregations$MockitoMock$485838759@3084} Method threw 'java.lang.NullPointerException' exception. Cannot evaluate org.elasticsearch.search.aggregations.Aggregations$MockitoMock$485838759.toString()

使用testng及以下版本的jars

powermock-api-mockito-2.0.2.jar

mockito-core-2.23.0.jar

您收到异常是因为 'getAsMap' 是最终方法,并且 mockito 进行了实际的 API 调用而不是模拟调用。 这是因为 Mockito 默认不支持 mocking final 方法和类。

解决方案:您需要包含一个 mockito-extension 插件来支持此功能,而且非常简单。

检查https://www.baeldung.com/mockito-final的步骤。

NullPointerException来自getAsMap方法的调用。

使用Mockito.doReturn(map).when(aggs).getAsMap(); 相反应该解决这个问题。

然而, PowerMockito中似乎存在一个错误,因为这样编写它不应该触发getAsMap()方法的调用(仍然会发生)。

我建议你在他们的bugtracker中为这个问题创建一个 bug 票。


如果为 Mockito 启用最终的Mockito (请参阅此处),则运行测试成功。

@RunWith(MockitoJUnitRunner.class)
public class TestExample {

    @Test
    public void testMyMethod() {
        Aggregations aggs = Mockito.mock(Aggregations.class);
        Cardinality cardinality = Mockito.mock(Cardinality.class);
        Map<String, Aggregation> map = new HashMap<String, Aggregation>();
        map.put("sample", cardinality);

        Mockito.doReturn(map).when(aggs).getAsMap();
        Assert.assertEquals(map, aggs.getAsMap());
    }
}

另一种选择可能是使用真正的Aggregations object 代替:

@Test
public void testMyMethod() {

    Cardinality cardinality = Mockito.mock(Cardinality.class);
    Mockito.when(cardinality.getName()).thenReturn("sample");

    List<Aggregation> list = new ArrayList<>();
    list.add(cardinality);

    Aggregations aggs = new Aggregations(list);
    Map<String, Aggregation> map = aggs.getAsMap();

    Assert.assertEquals(1, map.size());
    Assert.assertEquals(cardinality, map.get("sample"));
}  

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM