DAO单元测试
新建
Springboot
测试配置application-test.properties
,或则对应的 yaml 文件也可以。修改数据源为一个新的数据库,表结构和原来的一致。数据库名对应测试的配置。
新建
Mapper
文件测试类。idea 快捷键ctrl + shift + T
@ActiveProfiles
表示使用步骤 1 的数据库配置文件。@Sql
加载数据库初始化 init.sql 脚本,执行完方法之后,执行 clean.sql 脚本来清理脏数据。脚本位置:
/
表示单元测试包下的根,classpath
表示resources
文件夹目录。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
建立 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("", ""));*/
}
}