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寫 單元測試 案例的方法應該是什麼。

时间: 原作者:

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的安裝方法

希望它可以幫助

...