Тестовый блок Junit mockito дает исключение нулевого указателя - PullRequest
0 голосов
/ 21 апреля 2020

Здравствуйте, я новичок в Junit mockito
Я пытаюсь написать пример модульного теста, но когда я запускаю тестовый пример, я получаю исключение нулевого указателя.

фрагмент кода:

package com.dataguise.webservices;

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;


import static org.mockito.Mockito.*;

import com.dataguise.cache.CacheManager;
import com.dataguise.controller.CentralController;

import com.dataguise.webservices.beans.DgUserAuthorities;

class RestAPIsTest {


    @InjectMocks
    private CentralController controller;

    @Mock
    DgUserAuthorities dgUserAuthorities;

    @Mock
    private CacheManager cacheManager;


    @BeforeEach
    public void setup() {
        when(this.cacheManager.getCache(anyString())).thenReturn(true);
        MockitoAnnotations.initMocks(this);

    }

    @Test
    void testSession() {
        try {

            dgUserAuthorities = controller.login("d", "d", "", false);
            when(controller.login("d", "d", "", false)).thenReturn(dgUserAuthorities);
            assertEquals(dgUserAuthorities, dgUserAuthorities);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

Хотя тот же вызов метода в остальных API дает соответствующий результат.

1 Ответ

1 голос
/ 21 апреля 2020

В вашем тесте 2 ошибки

Ошибка 1: Смешивание аннотаций JUnit4 и JUnit5

  • org.junit.jupiter.api.Test от JUnit 5
  • org.junit.Before из JUnit 4

Таким образом, ваш метод @Before никогда не выполняется. Используйте org.junit.jupiter.api.BeforeEach вместо

Ошибка 2: Использование аннотаций Spring без расширения Spring

@Autowired происходит из DI-среды Spring. Он будет введен, только если вы используете Spring Injection / runner

Если вы хотите MockitoAnnotations.initMocks(this);, чтобы построить тестируемый объект и внедрить все макеты, используйте @InjectMocks

Ошибка 3: Запутанный способ инициализации макетов

Существует 2 способа инициализации макетов:

Вручную:

this.dgUserAuthorities = mock(DgUserAuthorities.class);
this.controller = new CentralController(this.dgUserAuthorities);

Использование аннотаций

@InjectMocks
private CentralController controller;

@Mock
DgUserAuthorities dgUserAuthorities;

Аннотации требуют звонка на MockitoAnnotations.initMocks(this) или с использованием расширения Mockito: @ExtendWith(MockitoExtension.class)

Я настоятельно не рекомендую вам смешивать 2 подхода. Кроме того, если вы используете аннотации, не инициализируйте поля самостоятельно.

...