Junit
Java自己的单元测试框架
在开始书写测试代码之前,我们先回顾一下JUnit常用的测试注解。在junit4和junit5中,注解的写法有些许变化。
junit4 | junit5 | 特点 |
---|---|---|
@Test | @Test | 声明一个测试方法 |
@BeforeClass | @BeforeAll | 在当前类的所有测试方法之前执行。注解在【静态方法】上 |
@AfterClass | @AfterAll | 在当前类中的所有测试方法之后执行。注解在【静态方法】上 |
@Before | @BeforeEach | 在每个测试方法之前执行。注解在【非静态方法】上 |
@After | @AfterEach | 在每个测试方法之后执行。注解在【非静态方法】 |
@RunWith(SpringRunner.class) | @ExtendWith(SpringExtension.class) | 类class定义上 |
使用Mockito编码完成接口测试
Mockito是一个测试框架
Mockito是GitHub上使用最广泛的Mock框架,并与JUnit结合使用.Mockito框架可以创建和配置mock对象.使用Mockito简化了具有外部依赖的类的测试开发。Mockito测试框架可以帮助我们模拟HTTP请求,从而达到在服务端测试目的。因为其不会真的去发送HTTP请求,而是模拟HTTP请求内容,从而节省了HTTP请求的网络传输,测试速度更快。
简而言之:模拟HTTP请求做测试的框架,节省了HTTP请求的网络传输,速度快。
1、 依赖
spring-boot-starter-test(Spring Boot 2.3.0.RELEASE)自动包含Junit 5 和Mockito框架,以下测试代码是基于Junit5,使用Junit4的同学请自行调整代码。
<!--spring-boot-starter-test(Spring Boot 2.3.5.RELEASE)自动包含Junit 5 和Mockito框架-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
2、 测试
/**
* 编码实现接口测试
*/
@Slf4j
public class ArticleMockitoHandlerTest {
// 1. 引入模拟http请求的mockMvc对象
private static MockMvc mockMvc;
// 初始化mockMvc对象,在所有测试方法的前面进行初始化
@BeforeAll
static void setMockMvc() {
// 2. 对哪个Handler进行测试的初始化mockMvc对象
mockMvc = MockMvcBuilders.standaloneSetup(new ArticleMockitoTestHandler()).build();
}
// 3. 写测试方法
@Test
public void saveArticle() throws Exception {
// 要发送的数据e
String article = "{\n" +
" \"id\": 1,\n" +
" \"auther\": \"zhouzhou\",\n" +
" \"title\": \"T\",\n" +
" \"content\": \"Mockito编码测试\",\n" +
" \"createTime\": \"2020-11-06 01:35:12\",\n" +
" \"reader\":[{\"name\":\"源\",\"age\":18},{\"name\":\"琼\",\"age\":17}]\n" +
"}";
// 4. perform执行模拟请求
MvcResult result = mockMvc.perform(
MockMvcRequestBuilders
.request(HttpMethod.POST, "/rest/articles")
.contentType("application/json")
.content(article)
)
// 期望返回的内容
.andExpect(MockMvcResultMatchers.status().isOk()) //HTTP:status 200
.andExpect(MockMvcResultMatchers.jsonPath("$.data.auther").value("zhouzhou"))
.andExpect(MockMvcResultMatchers.jsonPath("$.data.reader[0].age").value(18))
.andDo(print())
.andReturn();
// 处理乱码
result.getResponse().setCharacterEncoding("UTF-8");
log.info(result.getResponse().getContentAsString());
}
}