繁体   English   中英

在 SpringBoot 中模拟时获取 NullPointerException

[英]Getting NullPointerException while mocking in SpringBoot

我正在尝试为其中一个班级编写一个 Junit 测试用例。 但是在尝试时出错,

测试类如下所示 -

public class IntegratorClassTest{
    @InjectMocks    
    IntegratorClass integratorClass;

    @Mock
    RequestClass requestClass;

    @Mock
    ContentList contentResponse;

    @Before
    public void setUp() throws Exception {

        MockitoAnnotations.initMocks(this);
    }


    @Test
    public void getCmsOffersTest()throws Exception{
        ContentService contentService = Mockito.mock(ContentService.class);
        RequestClass requestClass = Mockito.mock(RequestClass.class);
        ContentList contentResponse = getContentList();
        when(contentService.getContentCollection()).thenReturn(contentResponse);

        Validator validator = Mockito.mock(Validator.class);
        List<OfferDetails> offerList = new ArrayList<OfferDetails>();
        Mockito.doNothing().when(validator).validateData(offerList);

        List<OfferDetails> offerListResult = integratorClass.getCmsOffers(contentService, requestClass);
        assertTrue(offerListResult.size()>0);
    }
}

实现类如下所示 -

public class IntegratorClass {
    private static final Logger LOGGER = LoggerFactory.getLogger(IntegratorClass.class);

    @Autowired
    Validator validator;

    public List<OfferDetails> getCmsOffers(ContentService contentService,RequestClass requestClass)throws Exception{
        LOGGER.info("Entered method getCmsOffers to get the list of offers from CMS");
        List<OfferDetails> offerList = new ArrayList<OfferDetails>();
        ContentList contentResponse = null;
        try 
        {
            contentResponse = contentService.getContentCollection();
            offerList = getOfferListFromCmsResponse(contentResponse, requestClass);

            LOGGER.info("Total number of active offers we got from CMS are -" + offerList.size());
        }catch (Exception e)
        {
            ErrorResponse errorResponse = PromotionalOffersUtilities.createErrorResponse("500", e.getMessage(),"Getting error while fetching content from CMS - getCmsOffers", ErrorResponse.Type.ERROR);
            LOGGER.error("Getting error while fetching content from CMS with Error Message: " + e.getMessage());
            throw new ServiceException(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR);
        }

        //failing here
        validator.validateData(offerList);
        LOGGER.info("Exiting method getCmsOffers");

        return offerList;
    }
}

当我在调试模式下运行它时, validator.validateData(offerList);行出现错误validator.validateData(offerList); .

它正在返回“ NullPointerException ”。

您需要在模拟依赖项时包含Validator ,以便将其注入到被测对象中

@Mock
Validator validator;

此外,在安排validator的行为时,请为被调用成员使用参数匹配器,因为当前设置不会匹配,因为它们将在执行测试时比较不同的实例。

Mockito.doNothing().when(validator).validateData(any(List<OfferDetails>.class));

您正在测试方法中手动模拟其他依赖项,因此除此之外不需要它们

现在测试变成

public class IntegratorClassTest{
    @InjectMocks
    IntegratorClass integratorClass;

    @Mock
    Validator validator;

    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void getCmsOffersTest()throws Exception{
        //Arrange
        ContentService contentService = Mockito.mock(ContentService.class);
        RequestClass requestClass = Mockito.mock(RequestClass.class);
        ContentList contentResponse = getContentList();
        Mockito.when(contentService.getContentCollection()).thenReturn(contentResponse);

        Mockito.doNothing().when(validator).validateData(any(List<OfferDetails>.class));

        //Act
        List<OfferDetails> offerListResult = integratorClass.getCmsOffers(contentService, requestClass);

        //Assert
        assertTrue(offerListResult.size() > 0);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM