博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客👦🏻 《java 面试题大全》 🍩惟余辈才疏学浅,临摹之作或有不妥之处,还请读者海涵指正。☕🍭 《MYSQL从入门到精通》数据库是开发者必会基础之一~ 🪁 吾期望此文有资助于尔,即使粗浅难及深广,亦备添少许微薄之助。苟未尽善尽美,敬请批评指正,以资改进。!💻⌨
在这篇文章中,我们将深入介绍如何在 Spring Boot 中进行单元测试,以及一些常用的工具和技巧。我们将侧重于以下几个方面:
让我们一一来探讨这些内容!
首先,让我们看一下如何进行 Service 层的单元测试。在 Spring Boot 中,单元测试类通常位于 src/test/java
目录下。你可以手动创建一个测试类,或者如果你使用的是 IDEA,可以使用快捷键 ⇧⌘T
(MAC) 或者 Ctrl+Shift+T
(Windows) 来自动生成测试类。
创建好测试类后,你可以编写测试方法。下面是一个示例:
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”即可。
Service 层测试之后,让我们再看看如何对 Controller 层进行单元测试。通常需要使用 MockMvc 来模拟 HTTP 请求,这样可以在不启动整个应用程序的情况下测试接口。
首先,创建一个 Controller 类的测试类:
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,这是因为拦截器可能会验证用户是否登录。
接下来,我们可以编写一些测试用例。比如,下面是一个新增教程的测试用例:
@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
注解即可:
@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。同时,我们还讨论了如何在单元测试中使用事务回滚,以保持数据库的干净和一致。
希望这篇文章对你有所帮助,如果你有任何疑问或需要进一步的解释,请随时告诉我。