繁体   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