首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Spring Boot使用单元测试

Spring Boot使用单元测试

作者头像
默 语
发布2024-11-20 08:18:32
发布2024-11-20 08:18:32
56700
代码可运行
举报
文章被收录于专栏:JAVAJAVA
运行总次数:0
代码可运行
Spring Boot使用单元测试

博主 默语带您 Go to New World.个人主页—— 默语 的博客👦🏻 《java 面试题大全》 🍩惟余辈才疏学浅,临摹之作或有不妥之处,还请读者海涵指正。☕🍭 《MYSQL从入门到精通》数据库是开发者必会基础之一~ 🪁 吾期望此文有资助于尔,即使粗浅难及深广,亦备添少许微薄之助。苟未尽善尽美,敬请批评指正,以资改进。!💻⌨

详细介绍:Spring Boot 中的单元测试
前言

在这篇文章中,我们将深入介绍如何在 Spring Boot 中进行单元测试,以及一些常用的工具和技巧。我们将侧重于以下几个方面:

  1. Service 层单元测试
  2. Controller 层单元测试
  3. 使用新的断言 assertThat
  4. 单元测试中的事务回滚

让我们一一来探讨这些内容!

Service 层单元测试

首先,让我们看一下如何进行 Service 层的单元测试。在 Spring Boot 中,单元测试类通常位于 src/test/java 目录下。你可以手动创建一个测试类,或者如果你使用的是 IDEA,可以使用快捷键 ⇧⌘T (MAC) 或者 Ctrl+Shift+T (Windows) 来自动生成测试类。

创建好测试类后,你可以编写测试方法。下面是一个示例:

代码语言:javascript
代码运行次数:0
运行
复制
package com.dudu.service;

import com.dudu.domain.LearnResource;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import static org.hamcrest.CoreMatchers.*;

@RunWith(SpringRunner.class)
@SpringBootTest
public class LearnServiceTest {

    @Autowired
    private LearnService learnService;

    @Test
    public void getLearn(){
        LearnResource learnResource = learnService.selectByKey(1001L);
        Assert.assertThat(learnResource.getAuthor(), is("测试"));
    }
}

上面的代码展示了一个简单的单元测试写法。在顶部,只需加上 @RunWith(SpringRunner.class)@SpringBootTest 注解即可。当你想运行测试时,将鼠标放在相应的测试方法上,右键选择“Run”即可。

Controller 层单元测试

Service 层测试之后,让我们再看看如何对 Controller 层进行单元测试。通常需要使用 MockMvc 来模拟 HTTP 请求,这样可以在不启动整个应用程序的情况下测试接口。

首先,创建一个 Controller 类的测试类:

代码语言:javascript
代码运行次数:0
运行
复制
package com.dudu.controller;

// ...

@RunWith(SpringRunner.class)
@SpringBootTest
public class LearnControllerTest {

    @Autowired
    private WebApplicationContext wac;

    private MockMvc mvc;
    private MockHttpSession session;

    @Before
    public void setupMockMvc(){
        mvc = MockMvcBuilders.webAppContextSetup(wac).build();
        session = new MockHttpSession();
        User user = new User("root", "root");
        session.setAttribute("user", user);
    }

    // ... (添加测试用例)
}

在上述代码中,我们使用了 MockMvcBuilders 创建了一个 MockMvc 对象,并设置了一个用户 session,这是因为拦截器可能会验证用户是否登录。

接下来,我们可以编写一些测试用例。比如,下面是一个新增教程的测试用例:

代码语言:javascript
代码运行次数:0
运行
复制
@Test
public void addLearn() throws Exception{
    String json = "{\"author\":\"HAHAHAA\",\"title\":\"Spring\",\"url\":\"http://tengj.top/\"}";
    mvc.perform(MockMvcRequestBuilders.post("/learn/add")
                .accept(MediaType.APPLICATION_JSON_UTF8)
                .content(json.getBytes())
                .session(session)
        )
       .andExpect(MockMvcResultMatchers.status().isOk())
       .andDo(MockMvcResultHandlers.print());
}

上述代码中,我们使用了 MockMvcRequestBuilders.post() 构建了一个 POST 请求,发送了一个 JSON 参数,并通过 .andExpect() 来验证返回的状态码是否为 200。

新断言 assertThat 的使用

JUnit 4.4 结合 Hamcrest 提供了一个全新的断言语法 assertThat。它允许我们通过 Hamcrest 提供的匹配符来表达对前面变量所期望的值的声明。下面是一些常用的匹配符示例:

  • equalTo:断言被测的值等于期望值。
  • equalToIgnoringCase:忽略大小写,断言被测的字符串等于期望字符串。
  • equalToIgnoringWhiteSpace:忽略头尾的空格,断言被测的字符串等于期望字符串。
  • containsString:断言被测的字符串包含期望的子字符串。

还有许多其他的匹配符可供使用,具体可以参考文末的参考链接。

单元测试回滚

在单元测试过程中,如果你不想在数据库中留下垃圾数据,你可以开启事务功能,方法或类头部添加 @Transactional 注解即可:

代码语言:javascript
代码运行次数:0
运行
复制
@Test
@Transactional
public void add(){
    LearnResource bean = new LearnResource();
    bean.setAuthor("测试回滚");
    bean.setTitle("回滚用例");
    bean.setUrl("http://tengj.top");
    learnService.save(bean);
}

这样测试结束后,数据将会自动回滚,不会在数据库中留下任何垃圾数据。如果你想关闭回滚,只需在 @Transactional 注解中添加参数 @Rollback(false) 即可。

如果你使用的是 MySQL 数据库,在某些情况下即使加了 @Transactional 注解也不会回滚,这时你需要确认你的默认引擎是否为 InnoDB。如果不是,你需要将默认引擎修改为 InnoDB。

总结

在本文中,我们深入了解了如何在 Spring Boot 中进行单元测试,并介绍了一些常用的工具和技巧,如 MockMvc 和 assertThat。同时,我们还讨论了如何在单元测试中使用事务回滚,以保持数据库的干净和一致。

希望这篇文章对你有所帮助,如果你有任何疑问或需要进一步的解释,请随时告诉我。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-10-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Spring Boot使用单元测试
  • 详细介绍:Spring Boot 中的单元测试
    • 前言
    • Service 层单元测试
    • Controller 层单元测试
    • 新断言 assertThat 的使用
    • 单元测试回滚
    • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档