单元测试报NullPointerException
测试功能见https://blog.csdn.net/awieo/article/details/136316293
1、一开始一直报NullPointerException,debug发现首先这条代码完全没执行到,显示ecommerceShopsMapper==null;
Mockito.when(ecommerceShopsMapper.selectEcommerceShopsByShopName(Mockito.anyString())).thenReturn(null);
2、原因A是在 @BeforeEach
方法中,已经使用MockitoAnnotations.openMocks(this);
来初始化Mock对象,可以直接使用 @InjectMocks
注解来注入 EcommerceShopsServiceImpl
对象到 importShopTest
中,无需手动创建一个实例。
@BeforeEachpublic void setUp() {MockitoAnnotations.openMocks(this);
//此行多余 importShopTest = new EcommerceShopsServiceImpl();}
原因B是这里的注解写错了,应为@InjectMocks;
@MockBean //应为@InjectMocks private EcommerceShopsServiceImpl importShopTest;
3、修改后代码为
package com.ecommerce.system.service.impl;import com.ecommerce.common.exception.ServiceException;
import com.ecommerce.system.domain.EcommerceShops;
import com.ecommerce.system.mapper.EcommerceShopsMapper;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
//import org.springframework.boot.test.mock.mockito.MockBean;
import javax.validation.Validator;
import java.util.ArrayList;
import java.util.List;import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;public class EcommerceShopsServiceImplTest {@Mockprivate EcommerceShopsMapper ecommerceShopsMapper;@Mockprivate Validator validator;@InjectMocksprivate EcommerceShopsServiceImpl importShopTest;@BeforeEachpublic void setUp() {MockitoAnnotations.openMocks(this);
// importShopTest = new EcommerceShopsServiceImpl();}@Testpublic void testImportShop_WithValidData() {List<EcommerceShops> shopList = new ArrayList<>();EcommerceShops shop1 = new EcommerceShops();shop1.setId(65);shop1.setShopName("Shop1");shop1.setShopOwner("Owner1");shop1.setMarketId(101L);// shop1.setMarketName("Market1");shop1.setShopContact("13145678954");shop1.setBuslicenseNumber("ABC123");// shop1.setAuditStatus(0);shop1.setUserId(1L);shopList.add(shop1);// 加入正确的数据String operName = "TestUser";
// 当调用 ecommerceShopsMapper 对象的 selectEcommerceShopsByShopName 方法并传入任意字符串参数时,
// Mockito将模拟该方法的行为,并返回 null 作为结果。这种模拟行为通常用于单元测试中,以便方便地控制方法的返回值,以验证代码的其他部分如何处理这些返回值。// when(ecommerceShopsMapper.selectEcommerceShopsByShopName(anyString())).thenReturn(null);Mockito.when(ecommerceShopsMapper.selectEcommerceShopsByShopName(Mockito.anyString())).thenReturn(null);String result = importShopTest.importShop(shopList, true, operName);assertEquals("恭喜您,数据已全部导入成功!共 1 条,数据如下:<br/>" +"1、账号 Shop1 导入成功", result);}}