При тестировании метода, возвращающего список сущностей, вылетает 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)
Попробуйте вот этот код
@InjectMocks
private ApplicationServiceImpl applicationService = new ApplicationServiceImpl();
А также возможно еще одна ошибка возникающая при стартапе
MockitoAnnotations.initMocks(this);
этого делать нет необходимости, так как это происходит при выполнении MockitoJUnitRunner
.
Такое ощущение, что Мокито не смог правильно заинжектить зависимости. Вот что говорит документаци:
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);
}
Если все отработает, то надо будет разбираться почему не сработал авто-инжект у Мокито
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
подскажите пожалуйстаКак удалить подстроку из ячейки, а саму подстроку взять из другой таблицы
Переменные x и y изменяются только в том случае, если нажата клавиша (одно нажатие - одно изменение)Мне нужно сделать автоповторение