我在嘗試對我的代碼進行單元測驗時遇到了一個奇怪的問題。
這是我的代碼:
public class ItemService {
private OfferService offerService;
@Inject
public ItemService (OfferService offerService){
this.offerService = offerService;
}
public List<Item> buildItems(ItemInfo itemInfo) {
List<Item> items = processItem(itemInfo);
Offers<Offer> offers = fetchItemInfo(items);
// based on the object offers, do some processing
}
private Offers<Offer> fetchItemInfo(List<Item> items) {
Offers<Offer> offers = new Offers<>();
// some processing here with offers.
// calling the db to fetch details
offerService.fetchInfoFromDB(offers);
return offers;
}
}
public class OfferService {
public void fetchInfoFromDB(Offers<Offer> offers) {
// fetching details from DB
// and updating the object **offers**
// myDao.getDetailsById(id);
}
}
現在我已經撰寫了 junit 來測驗方法buildItems()
更新更新使用的模擬
@RunWith(PowerMockRunner.class)
@PrepareForTest(ItemService.class)
public class ItemServiceTest{
@Mock private MyDAO myDao;
@Mock private OfferService offerService;
@Before
public void setUp() throws Exception {
ItemService itemService = new ItemService ();
}
public void testBuildItems(){
// some code -----
itemInfo = buildItemInfo();
offerDetail = buildOfferDetail();
when(myDao.getDetailsById(Mockito.anyLong())).thenReturn(offerDetail);
// some code -----
List<Item> items = itemService.buildItems(itemInfo);
Assert.assertNotNull(items);
}
}
我正在運行,我可以看到下面的行被執行了,但實際的方法沒有被呼叫:
offerService.fetchInfoFromDB(offers);
我在得到空值的優惠。然后我添加了以下行:
doCallRealMethod().when(offerService).fetchInfoFromDB(offers);
結果還是一樣。offer物件是通過參考傳遞的,并且在我已經模擬的 DB 呼叫之后得到更新。但是直到那個電話我的代碼沒有到達。如何更新 我的 junit 中的優惠物件。請幫忙。
uj5u.com熱心網友回復:
你能告訴你List<Item> items = processItem(itemInfo)在除錯時回傳什么嗎?其次, offerService 是類中的一個依賴項,但我沒有看到它被注入或初始化。
uj5u.com熱心網友回復:
您的測驗正在呼叫零 argItemService()建構式,而不是@Inject您發布的arg建構式。要么您的代碼無法編譯,要么您實際上并未向我們展示有問題的代碼。
另外,你說你在嘲笑offerService:
- 你叫
when上myDao,而不是offerService, - 你沒有將你的模擬傳遞給
offerService你的ItemService建構式,如new ItemService(offerService), 和 - 你
doCallRealMethod不會作業,因為你的模擬offerService不會使用你的模擬myDao;你需要offerService直接用thenAnswer改變傳遞的來模擬呼叫List<Offer>,就像我在你鏈接的問題上一樣。
如果你解決了這三個問題,你將離作業測驗更近了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/366887.html
