在Spring Boot测试中

首先

我在用SpringBoot创建的Web应用中实现了测试代码。

执行环境

操作系统:Mac
JUnit:JUnit5.8.2
Java:Amazon Corretto 8
Spring Boot:2.6.1
Gradle:gradle6.8
集成开发环境:IntelliJ IDEA 社区版 2021.1

建立测试环境

使用spring-boot-starter-test库

通过使用「spring-boot-starter-test」,可以使用必要的库来测试在SpringBoot上的代码。

所包含的库如下所示

ライブラリ備考JUnit5Javaアプリケーションの単体テストのための事実上の標準ライブラリ。Spring Test
Spring Boot TestSpring Bootアプリケーションのユーティリティ。
統合テストのための機能をサポートしています。AssertJ 高機能なアサーションライブラリ。Hamcrest マッチャーオブジェクトのライブラリ。
オブジェクトの状態をテストするのに利用される。Mockito Javaモックフレームワーク。
テストするクラスが依存しているDI管理下のオブジェクトをモック化したりできる。JSONassert JSON のアサーションライブラリ。JsonPath JSONでもXPATHのように、クエリ形式で要素を検索したりするライブラリ。

在build.gradle中添加依赖关系

将「spring-boot-starter-test」添加为依赖。

dependencies {
    // ・・・
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
	useJUnitPlatform()
}

写测试

测试的网页应用程序

测试的Web应用程序会返回”HelloWorld”。
它会从Controller接收请求,从Service获取字符串”HelloWorld”,然后返回给客户端。

@Controller
public class HelloWorldController {

    private HelloWorldService helloworldService;

    @Autowired
    public HelloWorldController(HelloWorldService helloworldService) {
        this.helloworldService = helloworldService;
    }

    @ResponseBody
    @GetMapping
    public String index() {
        return helloworldService.getString();
    }
}
@Service
public class HelloWorldService {

    public String getString() {
        return "HelloWorld";
    }
}

在Spring Boot-starter-test中编写测试的方法

如果要进行基于SpringBoot的测试,可以在测试类上使用@SpringBootTest注解。
通过使用@￰SpringBootTest注解,可以将SpringExtension指定为JUnit的扩展功能,从而可以使用以下功能。

・Spring TestContext框架
无需受限于JUnit等测试框架,它能在测试代码中支持DI管理和事务功能。

・MockMvc(Spring MVC 测试框架)
支持Spring MVC应用程序的测试。

对Controller进行测试。

在测试类中,使用@SpringBootTest和@AutoConfigureMockMvc对Controller进行测试,以确保能够请求到“HelloWorld”。

给予 @AutoConfigureMockMvc 后,将自动配置 MockMvc。
这样,可以像通常在服务器上运行时一样处理控制器和依赖的服务。

使用MockMvc和MockMvcRequestBuilders向控制器发送请求,然后使用MockMvcResultMatchers检查结果。

我正在验证对「http://localhost/」发出请求后的结果是,返回的http状态为OK(200),且内容包含「HelloWorld」。

这次我们执行了没有参数的请求,但我们也可以使用MockMvcRequestBuilders设置URL参数。

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;

@SpringBootTest
@AutoConfigureMockMvc
public class HelloWorldControllerTest {

    @Test
    void HelloWorldが取得されることを確認(@Autowired MockMvc mvc) throws Exception {

        mvc.perform(
                MockMvcRequestBuilders.get("/"))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.content().string("HelloWorld"));
    }
}

进行服务测试

像 Controller 的测试类一样给予 @SpringBootTest 标签。这里使用构造函数注入的方式获取依赖注入管理下的实例。

正常情况下执行Service方法,并使用断言库验证返回值。

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import static org.assertj.core.api.Assertions.assertThat;

@SpringBootTest
public class HelloWorldServiceTest {

    private final HelloWorldService helloWorldService;

    @Autowired
    public HelloWorldServiceTest(HelloWorldService helloworldService) {
        this.helloWorldService = helloworldService;
    }

    @Test
    void HelloWorldが取得されることを確認() throws Exception {
        String result = helloWorldService.getString();
        assertThat(result).isEqualTo("HelloWorld");
    }
}

文献引用

 

广告
将在 10 秒后关闭
bannerAds