单测事例

Gateway

controller

controller层mock service接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
@Slf4j
class BucketControllerTest extends BaseTest {

@Resource
private BucketController bucketController;
@Resource
private CommonService commonService;


@BeforeEach
void setUp() {
MockitoAnnotations.openMocks(this);
}

@Test
void uploadFile() {
BucketService bucketService = mock(BucketService.class);
// A调用B,B调用C,测试方法A调用B,mock掉C的方法
ReflectionTestUtils.setField(commonService, "bucketService", bucketService);
doNothing().when(bucketService).putObject(any(), any(), any(), any(), any());

try {
String s = bucketController.uploadFile(getMultipartFileTest());
assertNotNull(s);
} catch (IOException e) {
log.info(JSON.toJSONString(Arrays.asList(e.getStackTrace())));
}
}

@Test
void uploadPre() {
BucketService mock = mock(BucketService.class);
doNothing().when(mock).putObject(any(), any(), any(), any(), any());
ReflectionTestUtils.setField(bucketController, "bucketService", mock);

String s = bucketController.uploadPre(getMultipartFileTest());
assertNotNull(s);
}

private MultipartFile getMultipartFileTest() {
String rootPath = Objects.requireNonNull(BucketController.class.getClassLoader().getResource("")).getPath();
String filePath = rootPath + "/sheet.xlsx";
BufferedInputStream inputStream = FileUtil.getInputStream(filePath);
MockMultipartFile mockMultipartFile = null;
try {
mockMultipartFile = new MockMultipartFile("sheet.xlsx", inputStream);
} catch (IOException e) {
log.info(JSON.toJSONString(Arrays.asList(e.getStackTrace())));
}
return mockMultipartFile;
}

}

rpcImpl

rpc的实现类mock掉依赖的service

mock static

mock掉依赖三方rpc的静态方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class AuthCallBackRpcServiceImplTest extends BaseTest {

@Resource
private AuthCallBackRpcService authCallBackRpcService;

@Test
void authCallBackAsyncOfFaDaDa() {
// mock static method
try (MockedStatic<RpcHttpUtil> rpcHttpUtilMockedStatic = mockStatic(RpcHttpUtil.class)) {
when(RpcHttpUtil.getBodyString(any())).thenReturn(TestDOGenerateUtil.getRpcHttpRequestStr());
when(RpcHttpUtil.getMap(any())).thenReturn(TestDOGenerateUtil.getAuthCallBackForFadadaMap());
RpcHttpResponse rpcHttpResponse = authCallBackRpcService.authCallBackAsyncOfFaDaDa(TestDOGenerateUtil.getRpcHttpRequest());
rpcHttpUtilMockedStatic.verify(() -> RpcHttpUtil.getBodyString(any()));
rpcHttpUtilMockedStatic.verify(() -> RpcHttpUtil.getMap(any()));
assertNotNull(rpcHttpResponse);
}
}
}

Service

Mock httpClient

mock http请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class FadadaServiceImplTest extends BaseTest {

@Resource
private FadadaService fadadaService;
@MockBean
private UploadTemplateClient uploadTemplateClient;

@Test
void uploadTemplate() {
when(uploadTemplateClient.invoke(any(),any())).thenReturn(TestDOGenerateUtil.getFddReturnInApplyCert());
boolean http = fadadaService.uploadTemplate("1", "http");
assertTrue(http);
}
}

Mock Dao

mock Dao层接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
class AgentAgreementServiceImplTest extends BaseTest {

@Resource
private AgentAgreementService agentAgreementService;
@MockBean(name = "baseMapper")
private AgentAgreementMapper baseMapper;
@MockBean
private AgentAgreementMapper agentAgreementMapper;

@Test
void create() {
Mockito.when(baseMapper.selectOne(Mockito.any())).thenReturn(TestDOGenerateUtil.getAgentAgreementDO());
boolean b = agentAgreementService.create(TestDOGenerateUtil.getAgentCreateParam(), TestDOGenerateUtil.getAgentId(), TestDOGenerateUtil.getAgreementId());
Assertions.assertTrue(b);

Mockito.when(baseMapper.selectOne(Mockito.any())).thenReturn(null);
Mockito.when(baseMapper.insert(Mockito.any())).thenReturn(1);
boolean b1 = agentAgreementService.create(TestDOGenerateUtil.getAgentCreateParam(), TestDOGenerateUtil.getAgentId(), TestDOGenerateUtil.getAgreementId());
Assertions.assertTrue(b1);
}

@Test
void getByAgentIds() {
Mockito.when(agentAgreementMapper.selectList(Mockito.any())).thenReturn(Collections.singletonList(TestDOGenerateUtil.getAgentAgreementDO()));
List<AgentAgreementDO> agentAgreementDOS = agentAgreementService.getByAgentIds(Collections.singletonList(TestDOGenerateUtil.getAgentId()));
Assertions.assertTrue(CollUtil.isNotEmpty(agentAgreementDOS));
}

@Test
void update() {
Mockito.when(baseMapper.update(Mockito.any(),Mockito.any(Wrapper.class))).thenReturn(1);
boolean update = agentAgreementService.update(TestDOGenerateUtil.getAgentEditParam());
Assertions.assertTrue(update);
}

@Test
void batchSaveAgentAgreement() {
Mockito.when(agentAgreementMapper.saveBatch(Mockito.any())).thenReturn(true);
Boolean aBoolean = agentAgreementService.batchSaveAgentAgreement(Collections.singletonList(TestDOGenerateUtil.getAgentAgreementDO()));
Assertions.assertTrue(aBoolean);

Boolean bBoolean = agentAgreementService.batchSaveAgentAgreement(null);
Assertions.assertFalse(bBoolean);
}
}

Mock Rpc

mock 依赖的rpc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
@Slf4j
class CommonServiceImplTest extends BaseTest {

@Resource
private CommonService commonService;
@MockBean
// mock Rpc Service
private BucketService bucketService;

private final static String FILE_NAME = "sheet.xlsx";

@Test
void fmsUploadFile() {
doNothing().when(bucketService).putObject(any(), any(), any(), any(), any());
String s = commonService.fmsUploadFile(getInputStreamTest(), FILE_NAME);
Assertions.assertNotNull(s);
}

@Test
void fmsUploadFileByURI() {
doNothing().when(bucketService).putObject(any(), any(), any(), any(), any());
String s = commonService.fmsUploadFileByURI(getFilePathTest(), FILE_NAME);
Assertions.assertNotNull(s);
}

private InputStream getInputStreamTest() {
return FileUtil.getInputStream(getFilePathTest());
}

private String getFilePathTest() {
String rootPath = Objects.requireNonNull(BucketController.class.getClassLoader().getResource("")).getPath();
return rootPath + "/" + FILE_NAME;
}
}

Dao层单测

使用h2内存数据库, 测试sql可行性(需要排除启动类加载的正常MysqlConfiguration), 如@ComponentScan(value = "com.jkys.hs.*",excludeFilters = {@ComponentScan.Filter(type= FilterType.REGEX,pattern = "com\\.jkys\\.hs\\.config\\.app\\.DataSourceConfig")} ) 使用bean扫描中的excludeFilters属性排除不需要的bean

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class AgentContractMapperTest extends BaseTest {

@Resource
private AgentContractMapper agentContractMapper;

@Test
void insertList() {
AgentContractDO agentContractDO = TestDOGenerateUtil.getAgentContractDO();
agentContractDO.setId(null);
List<AgentContractDO> agentContractDOS = Arrays.asList(agentContractDO);
Integer integer = agentContractMapper.insertList(agentContractDOS);
Assertions.assertEquals(1, integer);
}

@Test
void selectByAgentAndStatusWithoutDeleted() {
List<AgentContractDO> agentContractDOS = agentContractMapper.selectByAgentAndStatusWithoutDeleted(TestDOGenerateUtil.getAgentId(), 0);
Assertions.assertNotNull(agentContractDOS);
}

@Test
void selectNotEndByAgent() {
List<AgentContractDO> agentContractDOS = agentContractMapper.selectNotEndByAgent(TestDOGenerateUtil.getAgentId(), new Date());
Assertions.assertNotNull(agentContractDOS);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;DATABASE_TO_UPPER=FALSE;MODE=MYSQL
spring.datasource.username=sa
spring.datasource.password=
# 建表语句
spring.datasource.schema=classpath:h2/schema.sql
# 需要初始化的insert语句
spring.datasource.data=classpath:h2/data.sql
spring.datasource.continue-on-error=true
spring.h2.console.enabled=true
spring.h2.console.path=/h2
spring.h2.console.settings.web-allow-others=true
spring.h2.console.settings.trace=true