Spring Boot下编写Controller层单元测试(一)

Maven依赖信息

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
</parent>

<dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- test -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- test end -->

</dependencies>

定义一个REST接口

定义一个实体类Demo

public class Demo {
    private String name;
        // setter, getter...
}

新建一个Controller类,定义一个查询方法。
URL为GET demos,调用成功后将返回一个json数组,http返回码为200 OK。

@Controller
@RequestMapping("demos")
public class DemoController {

    @GetMapping
    public ResponseEntity<List> searchDemo() {
        return new ResponseEntity<>(new ArrayList<Demo>(), HttpStatus.OK);
    }
}

编写测试用例

对于单元测试来说只需要关注Controller层,而不需要加载整个Spring上下文。

// 告诉junit使用MockitoJUnitRunner来运行测试用例
// 这样就可以使用@Mock和@InjectMocks注解
@RunWith(MockitoJUnitRunner.class)
public class MockDemoControllerTest {

    private MockMvc mockMvc;

    @InjectMocks
    private DemoController demoController; // 创建demoController

    @Before
    public void setUp() throws Exception {
                // 构造mockMvc,指定需要测试的Controller对象
        mockMvc = MockMvcBuilders.standaloneSetup(demoController).build();
    }

    @Test
    public void should_get_demos() throws Exception {
                // 调用此接口并断言返回 200 OK
        mockMvc.perform(get("/demos")).andDo(print())
                .andExpect(status().isOk());
    }

}

运行成功后将会打印以下信息


测试通过

总结

在本篇小文中介绍了如何针对Spring Boot编写的REST接口进行测试,用到了spring-tes提供的MockMvc实现对HTTP请求的模拟。除此之外,测试中还利用MockMvc提供的验证工具对结果进行断言。

本文只能算是一个开头,示例项目中并没有调用任何业务逻辑,我将在下一篇中讲述如何mock依赖关系。

SpringBoot基础之MockMvc单元测试

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容