使用Mockito编码完成接口测试

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请求的网络传输,速度快。

使用Mockito编码完成接口测试

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());

    }

}

使用Mockito编码完成接口测试

上一篇:MockMvc


下一篇:通过Mock测试控制器