java - 在 Spring Boot 服務單元測試中,java得到 nullPointer

  显示原文与译文双语对照的内容
85 5

假設我想為這個方法編寫單位計量經濟學

@Service
public class OfferServiceImpl implements OfferService {
@Autowired
OfferRepository OfferRepository;
@Override
public List<Offer> getAllOffers() {
 return OfferRepository.findAll();
}

我試著用兩種方式。

首先是

@RunWith(MockitoJUnitRunner.class)
public class OfferServiceTest {
@Mock
private OfferRepository offerRepositoryMock;
@InjectMocks
private OfferServiceImpl offerServiceImpl;
 @Test
 public void getAllOffersTest() {
 List<Offer> offerList=new ArrayList<>();
 offerList.add(new Offer("SE",new Date(), 10));
//line number 47 -->>when(offerRepositoryMock.findAll()).thenReturn(offerList);
 assertNotNull(offerServiceImpl.getAllOffers());
 assertEquals(offerList, offerServiceImpl.getAllOffers());
 }

還有 2nd

@RunWith(SpringRunner.class)
@SpringBootTest(classes = OfferServiceImpl.class) 
public class OfferServiceTest {
private OfferRepository offerRepositoryMock;
private OfferServiceImpl offerServiceImpl;
@Before
public void setUp() {
 offerRepositoryMock = Mockito.mock(OfferRepository.class);
 offerServiceImpl = new OfferServiceImpl();
}
@Test
public void getAllOffersTest() {
 List<Offer> offerList=new ArrayList<>();
 offerList.add(new Offer("SE",new Date(), 10));
 when(offerRepositoryMock.findAll()).thenReturn(offerList);
 assertNotNull(offerServiceImpl.getAllOffers());
 assertEquals(offerList, offerServiceImpl.getAllOffers());
}

除了例外,我同時嘗試了添加設置,但得到相同的異常

 `FAILED: getAllOffersTest
java.lang.NullPointerException
 at com.singh.recruitsystem.service.OfferServiceTest.getAllOffersTest(OfferServiceTest.java:47)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)`

什麼是差異b/w 兩種方法,以及如何解決 nullPOinter ecception 。我想將它的作為獨立測試。我的correect寫 單元測試 案例的方法應該是什麼。

时间:原作者:0个回答

108 4

你為什麼模仿 OfferServiceImplOfferServiceImpl 是包含要測試的方法的類。請不要模仿這個類。僅模擬 OfferRepository 類及其方法 findAll()如果這樣做,那麼剩下的就應該像。下面給出的代碼 Fragment 。

public class OfferServiceTest {
@Mock
private OfferRepository offerRepositoryMock;
private OfferServiceImpl offerServiceImpl = new OfferServiceImpl();
//Or use autowired maybe, I am not veru much familiar with Spring
@Test
public void getAllOffersTest() {
List<Offer> offerList=new ArrayList<>();
offerList.add(new Offer("SE",new Date(), 10));
when(offerRepositoryMock.findAll()).thenReturn(offerList);
assertNotNull(offerServiceImpl.getAllOffers());
assertEquals(offerList, offerServiceImpl.getAllOffers());
}
原作者:
118 0

@Mock 創建一個模擬。@InjectMocks 創建類的實例並注入用 @Mock ( 或者 @Spy) 註釋) 創建的模擬。

你下面的測試案例失敗

@Before
 public void setUp() {
 offerRepositoryMock = Mockito.mock(OfferRepository.class);
 offerServiceImpl = new OfferServiceImpl();
 }
 @Test
 public void getAllOffersTest() {
List<Offer> offerList=new ArrayList<>();
offerList.add(new Offer("SE",new Date(), 10));
when(offerRepositoryMock.findAll()).thenReturn(offerList);
assertNotNull(offerServiceImpl.getAllOffers());
assertEquals(offerList, offerServiceImpl.getAllOffers());
}

原因是此行,offerServiceImpl = new OfferServiceImpl();

你正在創建模擬,但不在服務中注入,因此你的服務對模擬注入沒有任何想法。

如果你想要簡單的解決方案,那麼在你的服務中就有一個構造函數

 @Autowired
 OfferServiceImpl(OfferRepository offerRepo) {
 this.OfferRepository = offerRepo;
 }

在測試用例變更到下面,這將解決這個問題。

 @Before
 public void setUp() {
 offerRepositoryMock = Mockito.mock(OfferRepository.class);
 offerServiceImpl = new OfferServiceImpl(offerRepositoryMock );
 }
原作者:
83 3

因為offerRepositoryMock從來沒有注入到服務中,所以你有一個空指針。你從不告訴 spring 來創建你的服務。

要做到這一點,它將在你的第二個測試 @Autowired 中添加到你的OfferServiceImpl,並使用註釋 @MockBean ( 。mockbean 。boot 。test 。) 。

使用這裡更改可以 delete的安裝方法

希望它可以幫助

原作者:
...