簡體   English   中英

模擬對象在服務調用中變為 null。 它們在測試 class 中作為模擬 object 可用,但是當到達服務 class 時,所有模擬都是 Z37A6259CC0C49DAE299A786

[英]Mocked objects turns null in service calls. They are available as mocked object in Test class but when reaches service class there all mocks' are null

這是我的 class。 在這個 class 中,我完成了 mocking 並在我的服務(SearchServiceImpl)中注入了模擬對象。 但問題是模擬沒有被注入,當我調試時,我看到當執行到達服務 class 時,所有模擬對象都會得到 null。 模擬對象在測試類中可用(通過@Mock 注釋模擬它們),但是當執行到達@spy 服務(SearchServiceImpl)時,模擬對象為空,因此它會在服務內引發 null 指針異常。

package com.sams.clubops.service.impl;

import com.sams.clubops.bo.InstantSavingsBO;
import com.sams.clubops.config.ElasticSearchProperties;
import com.sams.clubops.service.InstantSavingsService;
import com.sams.clubops.service.InventoryCacheService;
import com.sams.clubops.service.InventoryService;
import com.sams.clubops.utils.SearchClient;
import com.sams.clubops.vo.CustomerBasketOfferVO;
import com.sams.clubops.vo.CustomerBasketVO;
import com.sams.clubops.vo.ItemBaseVO;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.*;
import org.mockito.junit.jupiter.MockitoExtension;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;

/** @Author: vn0x42k @Date: 2/16/2019 10:55 AM */
@Slf4j
public class SearchApplicationTest {

  @Spy @InjectMocks private SearchServiceImpl searchServiceImpl;
  @Mock private InstantSavingsService instantSavingsService;
  @Mock private SearchClient searchClient;
  @Mock private ElasticSearchProperties elasticSearchProperties;
  @Mock private InventoryCacheService inventoryCacheService;
  @Mock private InventoryService inventoryService;

  @BeforeEach
  public void setup() throws Exception {
    MockitoAnnotations.openMocks(this);
    List<CustomerBasketOfferVO> customerBasketOfferVOList = new ArrayList<>();
    CustomerBasketOfferVO customerBasketOfferVO1 =
        CustomerBasketOfferVO.builder()
            .id(70001)
            .description("$80 OFF")
            .type("ITEM")
            .gs1Code("0040980059971")
            .featuredText("INST SV")
            .serialNumber(null)
            .settlementId(null)
            .gtin("980059971")
            .discount("2000")
            .productId("441016")
            .quantity("4")
            .build();

    CustomerBasketOfferVO customerBasketOfferVO2 =
        CustomerBasketOfferVO.builder()
            .id(null)
            .description("FREE INSTAL")
            .type("null")
            .gs1Code("null")
            .featuredText("null")
            .serialNumber(null)
            .settlementId(null)
            .gtin("980059971")
            .discount("1500")
            .productId("5")
            .quantity("4")
            .build();
    customerBasketOfferVOList.add(customerBasketOfferVO1);
    customerBasketOfferVOList.add(customerBasketOfferVO2);
    CustomerBasketVO customerBasketVO =
        CustomerBasketVO.builder()
            .offerSize(2)
            .basketID(2051)
            .offers(customerBasketOfferVOList)
            .build();
    Mockito.when(
            instantSavingsService.getInstantSavingsFromApiV2(
                Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any()))
        .thenReturn(customerBasketVO);
    List<InstantSavingsBO> instantSavingsBOList = new ArrayList<>();
    InstantSavingsBO instantSavingsBO =
        InstantSavingsBO.builder().itemNumber(980059971L).description("$80 OFF Pipi").build();
    instantSavingsBOList.add(instantSavingsBO);
    Mockito.when(instantSavingsService.getInstantSavingsDescFromDB(Mockito.anyList()))
        .thenReturn(instantSavingsBOList);
  }

  @Test
  public void getInstantSavingsTest1() throws Exception {
    List<ItemBaseVO> list = new ArrayList<>();
    ItemBaseVO itemBaseVO =
        ItemBaseVO.builder().itemId(441016).priceWithoutTax(new BigDecimal(13699)).build();
    list.add(itemBaseVO);
    List<ItemBaseVO> result =
        searchServiceImpl.getInstantSavings(
            list, "10192100917188856", 4969, "2019-12-23 09:31:00.000Z");
    assertEquals("$80 OFF Pipi", result.get(0).getInstantSavings().get("summaryDesc"));
  }

  @Test
  public void getInstantSavingsTest2() throws Exception {
    List<ItemBaseVO> list = new ArrayList<>();
    ItemBaseVO itemBaseVO = ItemBaseVO.builder().itemId(441016).build();
    list.add(itemBaseVO);
    assertEquals(
        list, searchServiceImpl.getInstantSavings(list, null, 4969, "2019-12-23 09:31:00.000Z"));
  }

  @Test
  public void getInstantSavingsTest3() throws Exception {
    List<ItemBaseVO> list = new ArrayList<>();
    ItemBaseVO itemBaseVO = ItemBaseVO.builder().itemId(441016).build();
    list.add(itemBaseVO);
    assertEquals(
        list, searchServiceImpl.getInstantSavings(list, null, 4969, "2019-12-23 09:31:00.000Z"));
  }

  @Test
  public void getInstantSavingsTest4() throws Exception {
    List<ItemBaseVO> list = new ArrayList<>();
    ItemBaseVO itemBaseVO = ItemBaseVO.builder().itemId(441016).build();
    list.add(itemBaseVO);
    assertEquals(
        list, searchServiceImpl.getInstantSavings(list, null, 4969, "2019-12-23 09:31:00.000Z"));
  }

  @Test
  public void getInstantSavingsTest5() throws Exception {
    List<ItemBaseVO> list = new ArrayList<>();
    ItemBaseVO itemBaseVO = ItemBaseVO.builder().itemId(441016).build();
    list.add(itemBaseVO);
    // mock getInstantSavingsFromApi
    List<CustomerBasketOfferVO> customerBasketOfferVOList = new ArrayList<>();
    CustomerBasketOfferVO customerBasketOfferVO2 =
        CustomerBasketOfferVO.builder()
            .id(null)
            .description("FREE INSTAL")
            .type("null")
            .gs1Code("null")
            .featuredText("null")
            .serialNumber(null)
            .settlementId(null)
            .discount("1500")
            .productId("5")
            .quantity("4")
            .build();
    customerBasketOfferVOList.add(customerBasketOfferVO2);
    CustomerBasketVO customerBasketVO =
        CustomerBasketVO.builder()
            .offerSize(2)
            .basketID(2051)
            .offers(customerBasketOfferVOList)
            .build();
    Mockito.when(
            instantSavingsService.getInstantSavingsFromApiV2(
                Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any()))
        .thenReturn(customerBasketVO);
    List<ItemBaseVO> result =
        searchServiceImpl.getInstantSavings(
            list, "10192100917188856", 4969, "2019-12-23 09:31:00.000Z");
    assertNull(result.get(0).getInstantSavings());
  }

  @Test
  public void getInstantSavingsTest6() throws Exception {
    List<ItemBaseVO> list = new ArrayList<>();
    ItemBaseVO itemBaseVO = ItemBaseVO.builder().itemId(441016).build();
    list.add(itemBaseVO);
    Mockito.when(instantSavingsService.getInstantSavingsDescFromDB(Mockito.anyList()))
        .thenReturn(null);
    List<ItemBaseVO> result =
        searchServiceImpl.getInstantSavings(
            list, "10192100917188856", 4969, "2019-12-23 09:31:00.000Z");
    assertNull(result.get(0).getInstantSavings());
  }
}

是什么讓您認為這是調用原始 function? 哪個測試失敗了? 他們全部?

您是否嘗試調試您的代碼以查看 SearchServiceImpl 的字段是否被模擬?

我不確定,但 Mockito 可能不支持在同一字段上使用@Spy@InjectMocks 請參閱此帖子: 是否不鼓勵在同一字段上使用 @Spy 和 @InjectMocks?

我還建議您使用@ExtendWith(MockitoExtension.class)來處理您的模擬,而不是手動調用MockitoAnnotations.openMocks(this)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM