JUnit FindById возвращает нулевой указатель (Mockito) - PullRequest
1 голос
/ 11 февраля 2020

Я пытаюсь написать тест JUnit для одного из моих сервисов в моем проекте, но я получаю ИСКЛЮЧЕНИЕ NULL POINTER каждый раз, когда я его запускаю.

Может кто-нибудь сказать, пожалуйста, что не так с мой код ???

Служба, которую я пытаюсь охватить:

    public City findById(Long cityId) {
        logger.info("City find by ID : {}", cityId);
        return cityDao.findById(cityId)
                .orElseThrow(() -> new ResourceNotFoundException(ErrorMessageEN.NO_CITY_FOUND_IN_DB));
    }

JUnit:

import static org.mockito.Mockito.when;
import java.util.Optional;
import org.junit.Before;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.junit.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)
class CityServiceImplTest {
    @InjectMocks
    private CityService cityService;

    @Mock
    private CityDao cityDao;

    private City city = new City();
    private Region region = new Region();

    @Before
    public void init() {
        city.setId(1L);
        city.setPinCode("1234");
        city.setCityName("Mumbai");

        region.setId(1L);
        region.setRegionName("Test");

        city.setRegion(region);
        MockitoAnnotations.initMocks(this);
    }

    @Test
    void findById_SUCCESS() {
        when(cityDao.findById(1L)).thenReturn(Optional.of(city));
        cityService.findById(1L);
    }
}

Это трассировка стека об этом:

java.lang.NullPointerException
    at com.recupmespoints.api.service.impl.CityServiceImplTest.findById_SUCCESS(CityServiceImplTest.java:48)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:675)
    at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
    at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:125)
    at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:132)
    at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:124)
    at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:74)
    at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)
    at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
    at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:104)
    at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:62)
    at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:43)
    at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:35)
    at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
    at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:202)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:198)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:69)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:135)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
    at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
    at java.util.ArrayList.forEach(ArrayList.java:1257)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
    at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
    at java.util.ArrayList.forEach(ArrayList.java:1257)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
    at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:229)
    at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:197)
    at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:211)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:191)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:137)
    at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:89)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)

Ответы [ 3 ]

2 голосов
/ 11 февраля 2020

У вас есть несколько проблем с тестовым классом:

  • Незначительный: Вам не нужно использовать MockitoAnnotations.initMocks(this); и @RunWith(MockitoJUnitRunner.class) вместе. Они в основном делают одно и то же.
  • Главный: Ваш тестовый класс должен быть public: public class CityServiceImplTest {...}

  • Еще один важный вопрос: Вы используете бегун JUnit 4 org.mockito.junit.MockitoJUnitRunner с аннотацией JUnit 5 org.junit.jupiter.api.Test. Я предлагаю придерживаться JUnit 4, импортируя вместо него org.junit.Test.

Упрощенная версия вашего теста в JUnit 4 будет выглядеть так:

import static org.mockito.Mockito.when;

import java.util.Optional;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)
public class CityServiceImplTest {

  @InjectMocks
  CityService cityService;

  @Mock
  CityDao cityDao;

  private City city = new City();

  @Before
  public void init() {
    city.setId(1L);
    city.setPinCode("1234");
    city.setCityName("Mumbai");
  }

  @Test
  public void findById() {
    when(cityDao.findById(1L)).thenReturn(Optional.of(city));
    cityService.findById(1L);
  }
}

Но если вы хотите для go с JUnit 5 вы должны использовать @BeforeEach и @ExtendWith(MockitoExtension.class):

import java.util.Optional;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;

@ExtendWith(MockitoExtension.class)
public class CityServiceImplTest {

  @InjectMocks
  CityService cityService;

  @Mock
  CityDao cityDao;

  private City city = new City();

  @BeforeEach
  public void init() {
    city.setId(1L);
    city.setPinCode("1234");
    city.setCityName("Mumbai");
  }

  @Test
  public void findById() {
    when(cityDao.findById(1L)).thenReturn(Optional.of(city));
    cityService.findById(1L);
  }
}
1 голос
/ 11 февраля 2020

Попробуйте импортировать org.junit.Test вместо импорта org.junit.jupiter.api.Test As @ org.junit.runner.RunWith не из junit5

0 голосов
/ 11 февраля 2020

Ваш метод init() помечен аннотацией org.junit.Before, но в целом тест выполняется с использованием JUnit 5, который не распознает метод, который должен быть вызван как часть процедуры установки. Значение MockitoAnnotations.injectMocks также никогда не вызывается.

Если вы хотите sh использовать JUnit5, вы должны аннотировать вашу установку с помощью @ BeforeEach , так как это эквивалентная аннотация из JUnit 5 .

В качестве альтернативы вы можете go использовать то, что уже предложили другие пользователи, и придерживаться API JUnit 4.

Суть в том, что не смешивайте версии JUnit, даже если это работает, это случайно.

...