单元测试service层代码
如果想在单元测试中使用Spring boot的依赖注入功能,需要在单元测试的class使用Spring boot的配置注解,如下方代码片段所示:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = DemoSpringApplication.class)
@WebAppConfiguration
class DemoTest {
// ...
}
- @RunWith 启用spring框架的junit4单元测试支持。可以使用@Autowired注解在单元测试中实现依赖注入。
- @SpringApplicationConfiguration 该注解载入了spring boot应用的配置信息
- @WebAppConfiguration 该注解载入了web配置的信息,比如说controller层的URI接口
测试service层代码,只需要将service声明为接口类型通过@Autowired注解注入到单元测试类中就可以了,如代码所示。
//DemoService.java
public interface DemoService {
void sayHello();
}
//DemoServiceImpl.java
public class DemoServiceImpl implements DemoService {
@Override
public void sayHello() {
System.out.println("Hello World");
}
}
//DemoServiceTest.java
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = DemoSpringApplication.class)
@WebAppConfiguration
public class DemoServiceTest {
@Autowired
private DemoService demoService;
@Test
public void test() {
demoService.sayHello(); //控制台输出"Hello World"
}
}
测试Controller层代码
和测试service层代码不同的是controller层代码的测试需要在测试代码中模拟出请求的发送,以及请求返回数据的匹配。
示例代码如下:
// DemoController.java
@RequestMapping("/test")
@RestController
public class DemoController {
@GetMapping("sayHello")
public String sayHello() {
return "Hello World";
}
}
// DemoControllerTest.java
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = DemoSpringApplication.class)
@WebAppConfiguration
public class DemoControllerTest {
@Autowired
private WebApplicationContext context; // 注入web应用上下文对象
private MockMvc mockMvc;
@Before
public void before() {
this.mockMvc = MockMvcBuilders.webAppContextSetup(context).build(); //配置mockMvc
}
@Test
public void test() throws Exception {
mockMvc.perform(get("/test/sayHello")).andDo(print()).andExpect(status().isOk()); // 打印请求内容,期待请求返回状态为200OK
}
}
基于controller层的单元测试需要静态导入以下class中的方法:
- import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.* 该类中包含有模拟GET,POST,PUT,DELETE等请求的Servlet请求构造器
- import static org.springframework.test.web.servlet.result.MockMvcResultHandlers 该类中包含有请求结果的处理器,比如说print(打印到控制台),log(日志输出)
- import static org.springframework.test.web.servlet.result.MockMvcResultMatchers 该类中包含有请求结果的匹配器。例如model(匹配model对象的值),view(匹配跳转的视图),forwardedUrl(匹配请求转发的URL), redirectUrl(匹配重定向的URL),status(匹配返回状态),header(匹配请求头),content(匹配请求体)等等。