Spring Boot 单元测试

单元测试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(匹配请求体)等等。

你可能感兴趣的:(Spring Boot 单元测试)