DAO单元测试

  1. 新建Springboot测试配置 application-test.properties,或则对应的 yaml 文件也可以。

    修改数据源为一个新的数据库,表结构和原来的一致。数据库名对应测试的配置。

  2. 新建Mapper文件测试类。idea 快捷键 ctrl + shift + T

    @ActiveProfiles表示使用步骤 1 的数据库配置文件。@Sql加载数据库初始化 init.sql 脚本,执行完方法之后,执行 clean.sql 脚本来清理脏数据。

    脚本位置:/表示单元测试包下的根,classpath表示resources文件夹目录。

  3. SpringBootTest 注解如果是在大型项目的模块内写单元测试无需添加该注解(因为模块可能不会运行没有启动类,只是单纯的代码)

// 激活test作为profile,使用准备好的空数据库
@ActiveProfiles("test")
@Transactional
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperTest {

    @Autowired
    UserMapper userMapper;

    @Test
	// /开头表示从classpath,(test)根目录开始搜索,没有以此开头默认在测试类所在包下。也可使用	  		classpath:、file:、http: 开头
    @Sql(scripts = {"classpath:sql/init.sql"}, executionPhase = 	Sql.ExecutionPhase.BEFORE_TEST_METHOD)
    @Sql(scripts = "classpath:sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD)
    public void test() {
        User user = userMapper.selectById(1);
        System.out.println(user.toString());
        Assert.assertEquals("Jone", user.getName());
    }
}

Service 单元测试 Mock

  1. 建立 service 单元测试类,通常用于服务间调用、RPC 调用、数据打桩。

    被 @Mock 标注的对象会自动注入到被 @InjectMocks 标注的对象中,InjectMocks 字段是无法注入其他InjectMocks 字段的,如下的 testController 是无法注入 coreService 的。

    可以手动注入:ReflectionTestUtils.setFiReld(testController, "coreService", coreService);

    @RunWith(MockitoJUnitRunner.class)
    @SpringBootTest(classes = GitbookApplication.class)
    public class InfoMapperTest {
        @Mock
        // 创建一个Mock
        private InfoMapper infoMapper;
    
        @InjectMocks
        // 创建一个实例,其余用@Mock(或@Spy)注解创建的mock将被注入到用该实例中。
        private CoreService coreService;
    
        @InjectMocks
        private TestController testController;
    
        @Test
        public void test() {
            // 打桩
            Info info = new Info();
            info.setPicUrlMd("picUrlMd").setPicUrl("picUrl").setPicLocalMd("picLocalMd").setPicLocalPath("picLocalPath")
                .setPicName("picName").setId(0L);
            Mockito.when(infoMapper.selectByPicLocalMd("picLocalMd")).thenReturn(info);
            Info info1 = infoMapper.selectByPicLocalMd("picLocalMd");
            System.out.println(info.toString());
    
        }
    
    }
    

Controller 单元测试

一般测试到 service 就差不多了。

@RunWith(SpringRunner.class)
// @WebMvcTest表示这是一个MVC测试,可传入多个待测试的Controller。
@WebMvcTest(UserController.class)
public class UserControllerTest {

    // MockMvc是Spring专门提供用于测试SpringMVC类
    @Autowired
    private MockMvc mockMvc;

    // @MockBean 用来模拟实现,因为在Spring MVC测试中并不会初始化@Service注解的类,需要自己模拟service实现。
    @MockBean
    private UserService userService;

    @Test
    public void getUser() throws Exception {
        int userId = 1;
        BDDMockito.given(userService.getById(1)).willReturn(new User());
        // perform,完成一次MVC调用,Spring MVC Test是servlet容器内部的模拟测试,不会发起真正的HTTP请求。
        // get,模拟一次GET请求。
        // andExpect,表示请求期望的返回结果
        mockMvc.perform(MockMvcRequestBuilders.get("/user/{id}", userId))
                .andExpect(MockMvcResultMatchers.content().string(String.valueOf(100)));
        String[] parameters = {};
//      模拟Post请求
        mockMvc.perform(MockMvcRequestBuilders.post("uri", parameters));

//      模拟文件上传
//        mockMvc.perform(MockMvcRequestBuilders.multipart("uri").file("fileName", "file".getBytes("UTF-8")));

//      模拟session和cookie
//        mockMvc.perform(MockMvcRequestBuilders.get("uri").sessionAttr("name", "value"));
//        mockMvc.perform(MockMvcRequestBuilders.get("uri").cookie(new Cookie("name", "value")));

//      设置HTTP Header
/*        mockMvc.perform(MockMvcRequestBuilders
                        .get("uri", parameters)
                        .contentType("application/x-www-form-urlencoded")
                        .accept("application/json")
                        .header("", ""));*/


    }
}
上次更新时间: 2024/5/7 05:59:02