为了账号安全,请及时绑定邮箱和手机立即绑定

Spring Boot:单元测试

标签:
SpringBoot

单元测试

单元测试注意事项

  • 测试方法必须用@Test修饰

  • 测试方法必须使用public void修饰,不能带参数

  • 一般使用单元测试会新建一个test目录存放测试代码,在生产部署时只要将test代码目录删除即可

  • 测试代码的包应该和被测试代码的包结构一致

  • 测试单元中的每个方法必须可以独立测试,方法间不能有任何依赖

  • 测试类一般用Test作为类名后缀

  • 测试放一般使用test作为方法名前缀

常用注解

  • @Test:将一个普通方法修饰称一个测试方法

    • @Test(excepted==xx.class) 忽略某异常类

    • @Test(timeout=毫秒数) 测试方法执行时间是否符合预期

  • @BeforeClass:会在所有方法执行前执行

  • @Afterclass:会在所有方法执行后执行

  • @Before:在每一个测试方法被运行前执行一次

  • @After:在每一个测试方法运行后执行一次

  • @Ignore:修饰的方法会被测试运行器忽略

  • @RunWith:更改测试运行器

    • @RunWith(SpringRunner.class)

Spring Boot 单元测试

  • Spring Boot 提供了两个包来支持单元测试:

    • spring-boot-test:包含测试的核心

    • spring-boot-test-autoconfigure:用来支持测试的自动配置

配置相关注解

@SpringBootTest

  • 它能够测试 SpringApplication,因为 SpringBoot 程序入口是SpringApplication,基本所有配置都会通过入口类去加载,也可以通过 classes 属性设置应用程序入口类,webEnvironment 可以设置 web 测试环境,可选属性有:

    • MOCK:提供一个模拟的Servlet环境,内置的Servlet容器没有启动,配合@AutoConfigureMockMvc使用

    • RANDOM_PORT:提供真实的Servlet环境,启动内置容器,随即端口

    • DEFINED_PORT:配置真实Servlet环境,使用默认端口

    • NONE:提供跟Mock一样不真实的Servlet环境

@LocalServerPort

  • 注解在属性上,注入端口号

@ActiveProfiles(profiles = "test")

  • 指定多环境测试时的环境配置

@Slf4j

  • 如果不想每次都写下面代码可以用注解@Slf4j

private  final Logger logger = LoggerFactory.getLogger(XXX.class);

@AutoConfigureMockMvc

  • 配合 @SpringBootTest 注入一个 MockMvc 实例

@WebAppConfiguration

  • 声明一个用于测试的 ApplicationContext 来模拟 ServletContext

测试例子

测试 REST 接口

  • 测试 REST 接口可以配合 TestRestTemplate

@RunWith(SpringRunner.class)@SpringBootTest(classes = Application.class,webEnvironment = WebEnvironment.RANDOM_PORT)public class RandomPortExampleTests {    @Autowired
    private TestRestTemplate restTemplate;    @Test
    public void exampleTest() {
        String body = this.restTemplate.getForObject("/", String.class);
        assertThat(body).isEqualTo("Hello World");
    }
}

测试 Spring MVC

  • 测试 SpringMVC Controller 可以使用 @WebMvcTEst,它会自动配置 MockMvc,Mock MVC 提供了一种方法来测试 MVC Controller,而不用启动完整的 HTTP Server

@Slf4j@RunWith(SpringRunner.class)@SpringBootTest(classes = Application.class)@AutoConfigureMockMvcpublic class SessionControllerTest {    @Autowired
    private MockMvc mvc;    private ObjectMapper objectMapper = new ObjectMapper();    @Test
    public void testLogin() throws Exception {
        LoginDTO loginDTO = new LoginDTO();
        loginDTO.setUsername("linyuan");
        loginDTO.setPassword("123456");        byte[] body = objectMapper.writeValueAsBytes(loginDTO);
        String resp = this.mvc.perform(
                post("/session")              //请求的URL
                        .content(body)                   //请求的数据
                        .param("请求的参数名","参数值")          //请求的参数
                        .contentType(MediaType.APPLICATION_JSON)    //请求数据的格式
                        .accept(MediaType.APPLICATION_JSON)         //接收返回数据的格式
        ).andExpect(status().isOk())                     //验证执行结果状态码
         .andDo(print())                                 //请求结果处理,输出请求结果
         .andReturn().getResponse().getContentAsString();       //最后返回的结果,将数据转换为字符串
        System.out.println(resp);
    }

}

----- 持续更新中 -----



作者:林塬
链接:https://www.jianshu.com/p/48273b0bb0df


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消