Nullpointer Исключение для насмешливого финального метода - PullRequest
0 голосов
/ 11 октября 2019

Получение NullPointerException при попытке макета Aggregations.getAsMap ()

Я уже пробовал другие способы, используя 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

1 Ответ

0 голосов
/ 11 октября 2019

NullPointerException происходит от вызова метода getAsMap.

Использование Mockito.doReturn(map).when(aggs).getAsMap(); вместо этого должно решить эту проблему.

Однако, похоже, есть ошибка в PowerMockito, так как ее запись не должна вызывать вызов метода getAsMap() (который все еще происходит).

Я предлагаю вамсоздайте заявку на ошибку в их bugtracker для этой проблемы.


Если вы включите окончательный макет для 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 объектом вместо:

@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"));
}  
...