почему mocking mongotemplate.aggregate () возвращает NullPointerException [Spring Boot Mockito] - PullRequest
0 голосов
/ 15 января 2020

Как смоделировать mongoTemplate.aggregation (). GetUniqueMappedResults ()?

Почему следующее возвращает NullPointerException в RepoClass?

mongoTemplate.aggregate(aggregation, COLLECTION_NAME,ScreenDetailsEntity.class);

Я новичок в Spring и написание тестовых случаев в первый раз. Я очень устала. Пожалуйста помоги. Заранее спасибо.

RepoTestClass (функция тестирования):

  @Test
  public void testValidGetScreenDetails() {
    ReflectionTestUtils.setField(
        screenDetailsRepoService, "screenFields",
        ClassUtil.getFieldName(ScreenDetailsEntity.class));
    Aggregation aggregation1 = Aggregation.newAggregation(
        match(where(PAGE).is("Bookings")),
        project(ClassUtil.getFieldName(ScreenDetailsEntity.class)),
        limit(1)
    );

    MongoTemplate mongoTemplate = Mockito.mock(MongoTemplate.class);
    Aggregation aggregation = Mockito.mock(Aggregation.class);
    ScreenDetailsEntity screenDetailsEntity = Mockito.mock(ScreenDetailsEntity.class);
    AggregationResults<ScreenDetailsEntity> aggregationResultsMock = Mockito
        .mock(AggregationResults.class);
    Mockito.when(aggregationResultsMock.toString()).thenReturn(new String());
    Mockito.doReturn(aggregationResultsMock).when(mongoTemplate).aggregate(aggregation1, COLLECTION_NAME, ScreenDetailsEntity.class);

    Mockito.doReturn(screenDetailsEntity).when(aggregationResultsMock).getUniqueMappedResult();
    screenDetailsRepoService.getScreenDetails(
        "Bookings", "Web8", "List/View", "en", 45429, 121);
  }

RepoClass:

public class ScreenDetailsRepoService {

  @Autowired
  private MongoTemplate mongoTemplate;

  private String[] screenFields;

  @PostConstruct
  public void init() {
    screenFields = ClassUtil.getFieldName(DetailsEntity.class);
  }

  public ScreenDetailsEntity getScreenDetails(final @NonNull String page,
      final @NonNull String client, final String module,
      final String locale, final Integer hotelId, final Integer countryId
  ) throws NoDataFoundException {
    ScreenDetailsEntity screenDetailsEntity;
    Aggregation aggregation = newAggregation(
        match(where(PAGE).is(page)),
        project(screenFields),
        limit(1)
    );
    long t1 = System.currentTimeMillis();
    screenDetailsEntity = mongoTemplate.aggregate(aggregation, COLLECTION_NAME, ScreenDetailsEntity.class).getUniqueMappedResult();
    log.info(
        "DB Query: ScreenDetailsRepoService : getScreenDetails - Time taken for db requests : {} milliseconds",
        (System.currentTimeMillis() - t1));
    if (screenDetailsEntity == null) {
      log.error(
          "ScreenDetailsRepoService::getScreenDetails - No data found for for page {} ,module {}, locale {}, hotel {}, country {}",
          page, module, locale, hotelId, countryId);
      throw new NoDataFoundException("No data found");
    }
    return screenDetailsEntity;
  }

Ответы [ 2 ]

0 голосов
/ 15 января 2020

Попробуйте использовать аннотации, создайте макет MongoTemplate и вставьте его в ScreenDetailsRepoService , используя аннотацию InjectMock:

@Mock
private MongoTemplate mongoTemplate;

@InjectMock
private ScreenDetailsRepoService screenDetailsRepoService;
0 голосов
/ 15 января 2020

Мое лучшее предположение заключается в том, что параметр Aggregation в методе настройки макета

Mockito.doReturn(aggregationResultsMock).when(mongoTemplate).aggregate(aggregation1, COLLECTION_NAME, ScreenDetailsEntity.class);

не равен фактическому значению при вызове mongoTemplate.aggregate в getScreenDetails. Mockito использует метод equals, чтобы проверить, совпадают ли параметры, и если не найдены соответствующие настройки макета, null будет возвращено по умолчанию.

В качестве первого теста вы можете попробовать смоделировать метод для любого Агрегации параметр. Например,

Mockito.doReturn(aggregationResultsMock).when(mongoTemplate).aggregate(Mockito.any(Aggregation.class), Mockito.eq(COLLECTION_NAME), Mockito.eq(ScreenDetailsEntity.class));

Таким образом, вы можете проверить, вызывает ли проблема параметр агрегации.

Затем вам следует убедиться, что методы equals и hashCode Aggregation класс правильно реализован.

...