[英]Getting NullPointerException when stubbing repository
Hi I am trying to write some test for my app but I got stuck.嗨,我正在尝试为我的应用程序编写一些测试,但我被卡住了。 I am getting NPE when stubbing my repository and I cant figure out why.我在存根存储库时遇到了 NPE,但我不知道为什么。 The test is pointless but I want to understand what is wrong with it.测试毫无意义,但我想了解它有什么问题。 Any help appriciated:)任何帮助appriciated:)
Repo:回购:
@Repository
public interface ItemRepository extends CrudRepository<Item, String> {}
Service:服务:
@Service
public class ItemService {
@Autowired
ItemRepository itemRepository;
@Autowired
SteamMarketItemService steamMarketItemService;
public void addItem(Item item) {
itemRepository.save(item);
}
public List<Item> getAllItems() {
return (List<Item>) itemRepository.findAll();
}
Test:测试:
@RunWith(MockitoJUnitRunner.class)
class ItemServiceTest {
@Mock
ItemRepository itemRepository;
@InjectMocks
ItemService itemService;
@Test
void getAllItems_shouldReturnListOfItems() {
//given
List<Item> itemList = Collections.singletonList(new Item());
//when
when(itemRepository.findAll()).thenReturn(itemList);
List<Item> returnedItems = itemService.getAllItems();
//then
Assert.assertEquals(itemList,returnedItems);
}
}
Error:错误:
java.lang.NullPointerException
at itemServiceTest.getAllItems_shouldReturnListOfItems(ItemServiceTest.java:34)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1507)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1507)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)
You may need to use MockitoExtension
您可能需要使用MockitoExtension
@Mocks
are dependencies to your @InjectMocks
reference. @Mocks
是您的@InjectMocks
引用的依赖项。 In this case, your annotation on Service and Repository are correct.在这种情况下,您对 Service 和 Repository 的注释是正确的。
Here is how I am able to solve this if using JUnit5如果使用 JUnit5,这就是我如何解决这个问题
package com.example.demo;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import static org.mockito.ArgumentMatchers.any;
@ExtendWith(MockitoExtension.class)
class ItemServiceTests {
@InjectMocks
ItemService itemService;
@Mock
ItemRepository itemRepository;
@Test
void testItemServiceSaveItem() {
Item item = new Item(312, "Test Mock");
Mockito.when(itemRepository.save(item)).thenReturn(item);
final Item saveItem = itemService.addItem(item);
Mockito.verify(itemRepository, Mockito.times(1)).save(any(Item.class));
Assertions.assertNotNull(saveItem, "Saved object cannot be null");
Assertions.assertEquals(312, item.getId());
}
@Test
void testGetItemListSuccess() {
//given
List<Item> itemList = Collections.singletonList(new Item());
//when
Mockito.when(itemRepository.findAll()).thenReturn(itemList);
List<Item> returnedItems = itemService.getAllItems();
//then
Assertions.assertEquals(itemList, returnedItems);
}
@Test
void testGetItemListFailure() {
//given
List<Item> itemList = Collections.singletonList(new Item());
//when
Mockito.when(itemRepository.findAll()).thenReturn(Arrays.asList(
new Item(),
new Item()
));
List<Item> returnedItems = itemService.getAllItems();
//then
Assertions.assertNotEquals(itemList, returnedItems);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.