Mockito возвращает NullPointerException

238
02 мая 2018, 05:58

При тестировании метода, возвращающего список сущностей, вылетает NullPointerException.

Код тестового класса:

@RunWith(MockitoJUnitRunner.class)
class ApplicationServiceImplTest {
    private List<Book> booksList;
    @Mock
    private BookRepository repository;
    @InjectMocks
    private ApplicationServiceImpl applicationService;
    @Before
    public void setUp(){
        MockitoAnnotations.initMocks(this);
        booksList = new ArrayList<>();
        booksList.add(new Book("Heidi","Unknown"));
        booksList.add(new Book("The Normal Christian Life","Unknown"));
        booksList.add(new Book("GAPS","Unknown"));
        booksList.add(new Book("The Well-Behaved Child","Unknown"));
        booksList.add(new Book("Life Skills for Kids","Unknown"));
        booksList.add(new Book("iBlog","Unknown"));
        booksList.add(new Book("Unwired Mom","Unknown"));
        booksList.add(new Book("The Voyage of the Dawn Treader","Unknown"));
        booksList.add(new Book("Doctor Dolittle","Unknown"));
        booksList.add(new Book("Spell to Write and Read","Unknown"));
    }
    @Test
    void getAllEntitiesTest() {
        when(repository.getBooks()).thenReturn(booksList);
        List<Book> all = applicationService.getAllBooks();
        verify(repository, times(1)).getBooks();
        Assert.assertArrayEquals(all.toArray(), booksList.toArray());
    }
}

Текст ошибки:

java.lang.NullPointerException
at application.services.ApplicationServiceImplTest.justTest(ApplicationServiceImplTest.java:68)
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:389)
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:115)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:167)
at org.junit.jupiter.engine.execution.ThrowableCollector.execute(ThrowableCollector.java:40)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:163)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:110)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:57)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$execute$3(HierarchicalTestExecutor.java:83)
at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:77)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$null$2(HierarchicalTestExecutor.java:92)
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
at java.util.Iterator.forEachRemaining(Iterator.java:116)
at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$execute$3(HierarchicalTestExecutor.java:92)
at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:77)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$null$2(HierarchicalTestExecutor.java:92)
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
at java.util.Iterator.forEachRemaining(Iterator.java:116)
at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$execute$3(HierarchicalTestExecutor.java:92)
at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:77)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:51)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:43)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:170)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:154)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:90)
at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:74)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Answer 1

Попробуйте вот этот код

@InjectMocks
private ApplicationServiceImpl applicationService = new ApplicationServiceImpl(); 

А также возможно еще одна ошибка возникающая при стартапе

MockitoAnnotations.initMocks(this);

этого делать нет необходимости, так как это происходит при выполнении MockitoJUnitRunner.

Answer 2

Такое ощущение, что Мокито не смог правильно заинжектить зависимости. Вот что говорит документаци:

Mockito will try to inject mocks only either by constructor injection, setter injection, or property injection in order and as described below. If any of the following strategy fail, then Mockito won’t report failure; i.e. you will have to provide dependencies yourself.

У вас в классе ApplicationServiceImpl только одна дополнительная зависимость на BookRepository ? Если есть другие, то проинициализируйте их явно через @Mock. Есть вероятность, что не все зависимости были удовлетворены и он свалился с ошибкой.

Также есть у вас есть возможность самостоятельно инициализировать класс ApplicationServiceImpl, попробуйте что-то в этом духе:

  @InjectMocks
  private ApplicationServiceImpl applicationService;
  @Before
  public void setUp(){
    booksList = new ArrayList<>();
    booksList.add(new Book("Heidi","Unknown"));
    .....
    booksList.add(new Book("Spell to Write and Read","Unknown"));
    applicationService = new ApplicationServiceImpl();
    applicationService.setBookRepository(repository);
    //или через конструктор 
    applicationService = new ApplicationServiceImpl(repository);
}

Если все отработает, то надо будет разбираться почему не сработал авто-инжект у Мокито

READ ALSO
APACHE POI [3.17] - проблема с xddf

APACHE POI [3.17] - проблема с xddf

Пример из LineChart

269
MySQL. Как удалить подстроку из ячейки

MySQL. Как удалить подстроку из ячейки

подскажите пожалуйстаКак удалить подстроку из ячейки, а саму подстроку взять из другой таблицы

206
SELECT проблема с WHERE

SELECT проблема с WHERE

Составил запрос на тех кто вчера был:

194
Как сделать постоянно движение змейки?

Как сделать постоянно движение змейки?

Переменные x и y изменяются только в том случае, если нажата клавиша (одно нажатие - одно изменение)Мне нужно сделать автоповторение

252