在SpringBoot中进行模拟时获取NullPointerException

时间:2018-12-04 22:50:22

标签: java spring-boot mocking mockito

正在尝试为其中一个类编写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);行是错误的。

返回“ NullPointerException”。

1 个答案:

答案 0 :(得分:1)

在模拟依赖项时,您需要包括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);
    }
}