测试功能见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
中,无需手动创建一个实例。
@BeforeEach
public 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 {
@Mock
private EcommerceShopsMapper ecommerceShopsMapper;
@Mock
private Validator validator;
@InjectMocks
private EcommerceShopsServiceImpl importShopTest;
@BeforeEach
public void setUp() {
MockitoAnnotations.openMocks(this);
// importShopTest = new EcommerceShopsServiceImpl();
}
@Test
public 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);
}
}