【发布时间】:2021-06-16 11:22:27
【问题描述】:
我有两个实体 isv 和 app。
CREATE TABLE `isv` (
`id` int primary key,
`code` varchar(128) not null
);
CREATE TABLE `app` (
`id` int primary key,
`isv_code` varchar(128) not null,
`code` varchar(128) not null
);
我添加了两个控制器:IsvController::createIsv 和 AppController::createApp。
现在,我需要添加单元测试。
IsvControllerTest::createIsvTest 构建 isv 并通过 mockmvc 调用 IsvController::createIsv,然后我添加 @Rollback 将自动清除脏数据。 IsvControllerTest.java
@Transactional
@Rollback
@Test
public void createIsv() throws Exception {
IsvCreateDTO isvCreateDTO = IsvDataBuilder.isvCreateDTO();
String body = objectMapper.writeValueAsString(isvCreateDTO);
MockHttpServletRequestBuilder request = MockMvcRequestBuilders.post("/isvs").contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON).content(body);
MvcResult mvcResult = mockMvc.perform(request).andExpect(MockMvcResultMatchers.status().isOk()).andReturn();
Result<String> result = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), Result.class);
assertTrue(result.getCode() == 0 && result.getResult().equals(isvCreateDTO.getCode()));
}
AppControllerTest::createApp 需要测试创建应用,但应用需要存在 isv_code。所以我会先创建一个isv,不过它和IsvControllerTest::createIsvTest是一样的。 AppControllerTest.java
@Transactional
@Rollback
@Test
public void createApp() throws Exception {
IsvCreateDTO isvCreateDTO = IsvDataBuilder.isvCreateDTO();
String body = objectMapper.writeValueAsString(isvCreateDTO);
MockHttpServletRequestBuilder request = MockMvcRequestBuilders.post("/isvs").contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON).content(body);
MvcResult mvcResult = mockMvc.perform(request).andExpect(MockMvcResultMatchers.status().isOk()).andReturn();
Result<String> result = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), Result.class);
assertTrue(result.getCode() == 0 && result.getResult().equals(isvCreateDTO.getCode()));
AppCreateDTO appCreateDTO = AppDataBuilder.appCreateDTO();
body = objectMapper.writeValueAsString(appCreateDTO);
request = MockMvcRequestBuilders.post("/apps").contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON).content(body).header("isvCode", isvCreateDTO.getCode()); // <<<<< Notice !!!
mvcResult = mockMvc.perform(request).andExpect(MockMvcResultMatchers.status().isOk()).andReturn();
result = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), Result.class);
assertTrue(result.getCode() == 0 && result.getResult().equals(appCreateDTO.getCode()));
}
如何组织更好的单元测试以避免重复创建 isv?
【问题讨论】:
标签: junit integration-testing spring-test