Spring Test 单元测试配置

在编写Spring Boot程序时,由于使用了@Autowire进行自动注入,直接使用Junit编写测试会无法实现。这是因为没有启动对应的Spring容器,这些自动注入就无法进行。

要对Spring Boot程序进行测试,只能使用Spring提供的Spring Test,结合Junit进行测试。

1、maven依赖

除了添加Spring boot本身所需的依赖以外,还需要引入Spring Test相关的依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

2、简单示例

2.1、注入测试

测试时,如果没有启动Spring容器,会导致@Autowired失效,从而导致空指针异常。为了可以在测试用例中使用@Autowired,需要的注解有:

  • @Runwith(SpringRunner.class)
  • @SpringBootTest(classes = 当前Spring程序的入口类.class)
  • @Autowired
//这两个注解表示是SpringTest
@RunWith(SpringRunner.class)
@SpringBootTest(classes = App.class)
public class Test {
    @Autowired
    ClassA classA;

    @org.junit.Test
    public void testAutowired(){
        //查看注入是否成功
        assertThat(classA).isNotNull();
    }
}

2.2、web测试

在web项目中,我们经常需要模拟一个HTTP请求,看写的Controller是否表现正常。

2.2.1、启动Server进行测试

第一种方法是不只启动Spring容器,还启动Server,然后发出请求,验证回复。需要的注解有:

  • @Runwith(SpringRunner.class)
  • @SpringBootTest(classes = 当前Spring程序的入口类.class,webEnvironment = WebEnvironment.RANDOM_PORT)
  • @LocalServerPort
  • @Autowired

以及一个特殊的模板类:TestRestTemplate。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class,webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class WebTest {
    //使用随机接口,避免接口被占用导致测试无法进行
    @LocalServerPort
    private int port;
    //用于快速获取REST请求返回的对象
    @Autowired
    private TestRestTemplate restTemplate;

    @Test
    public void greetingShouldReturnDefaultMessage() throws Exception {
        assertThat(this.restTemplate.getForObject("http://localhost:" + port + "/",
                String.class)).contains("Hello world");
    }
}

类似的可以使用postForObject发送post请求。

2.2.2、不启动Server进行测试

第二种方法是只启动Spring容器,不启动Server,用一个“Mock MVC”单独测试web层。需要的注解有:

  • @Runwith(SpringRunner.class)
  • @SpringBootTest(classes = 当前Spring程序的入口类.class)
  • @AutoConfigureMockMvc
  • @Autowired

以及一个特殊的类:MockMvc。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
@AutoConfigureMockMvc
public class MockMvcTest {
    //用于模拟web层
    @Autowired
    private MockMvc mockMvc;

    @Test
    public void shouldReturnDefaultMessage() throws Exception {
        this.mockMvc
                //发送请求
                .perform(MockMvcRequestBuilders.get("/"))
                //打印响应信息
                .andDo(MockMvcResultHandlers.print())
                //判断响应状态是否==200
                .andExpect(MockMvcResultMatchers.status().isOk())
                //判断响应结果是否包含制定字符串
                .andExpect(MockMvcResultMatchers.content().string(Matchers.containsString("Hello world")));
    }
}

 

 

转载于:https://my.oschina.net/pierrecai/blog/1186345

### 编写 Spring 框架中的单元测试Spring 框架中编写单元测试涉及多个方面,包括设置测试环境、使用依赖注入以及编写具体的测试逻辑。 #### 设置测试环境 为了使 JUnit 测试能够访问 Spring 容器并利用其特性,在测试类上需指定特定的注解以便于加载应用上下文。`@RunWith(SpringJUnit4ClassRunner.class)` 注解用于指示 JUnit 使用由 Spring 提供的运行器来执行测试案例[^1]。与此同时,通过 `@ContextConfiguration` 可以定义配置元数据的位置或者直接指向包含组件扫描路径的 Java 配置类。 对于基于 Spring Boot 的项目,默认情况下会采用更简洁的方式——即使用 `@SpringBootTest` 或者针对具体切面的其他专门化注解(如 `@WebMvcTest`, `@DataJpaTest`),它们内部已经集成了必要的配置支持[^2]。 #### 自动注入被测服务实例 借助 Spring 的 IoC (Inversion of Control) 容器机制,可以在测试类里声明待检验的服务层对象作为成员变量,并标记为 `@Autowired` 类型字段或构造函数参数的形式让容器负责其实例化的职责。这种方式不仅简化了初始化过程还增强了灵活性和重用度。 ```java import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; public class MyServiceTest { @Autowired private MyService myService; @Test public void testMyMethod() { int result = myService.myMethod(5); assertEquals(10, result); } } ``` 这段代码展示了如何在一个名为 `MyServiceTest` 的测试类中自动装配一个叫作 `myService` 的业务逻辑实现类,并对其方法进行了简单的验证操作。 #### 单元测试工具的选择与集成 除了核心框架外,通常还会引入额外的支持库来增强测试能力。例如,JUnit Jupiter API 是新一代 JUnit 版本的一部分,提供了现代化的功能集合;而像 Mockito 这样的模拟框架则允许开发者轻松地隔离外部依赖关系从而专注于单个模块的行为评估[^3]。 要将这些工具加入 Maven 构建脚本,则可通过添加相应的 POM 文件片段完成: ```xml <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.9.1</version> <scope>test</scope> </dependency> <!-- 如果需要Mockito --> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>最新版本号</version> <scope>test</scope> </dependency> ``` 以上就是有关于怎样在 Spring 应用程序内构建有效的单元测试体系的一些指导原则和技术要点介绍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值