【问题标题】:How avoid duplicate test in junit?如何避免junit中的重复测试?
【发布时间】: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


    【解决方案1】:

    如果没有看到您的任何代码,很难具体说明。一般来说,我建议为您的测试类创建一个包含通用设置代码的基类。

    编辑:显然这与设置代码的重复无关。您的测试是集成测试,通常速度较慢且设置复杂。在您的特定情况下,我会将所有这些放在一个测试用例中。首先测试 isv 的创建,然后在同一个测试用例中测试应用程序的创建。这实际上是您的 createApp() 测试用例已经在做的事情。

    【讨论】:

    • 那么,我应该把 createIsvTest 放到 createAppTest 并删除 createIsvTest 吗?
    • createApp 已包含所有createIsv。摆脱createIsv
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多