# SpringBoot3教程 - 4 单元测试

在开发项目的时候,需要测试代码是否正确,但是调用 service 或 dao 层的代码,没有 Spring 的上下文环境,无法直接调用。如果编写 controller 接口去调用又很麻烦,所以集成并使用单元测试是很有必要的。

下面演示一下SpringBoot中的单元测试,这样后面测试代码的时候比较方便。

# 1 添加依赖

首先引入 spring-boot-starter-test 单元测试依赖。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>
1
2
3
4
5
6
7

# 2 测试service

# 1 编写service

编写一个 service 类,并编写要测试的方法,后面单元测试的时候,调用这个方法。

UserServiceImpl.java

package com.doubibiji.hellospringboot.service.impl;

import com.doubibiji.hellospringboot.service.IUserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

@Slf4j
@Service
public class UserServiceImpl implements IUserService {

    /**
     * 测试方法
     */
    public String getUserInfo(String userId) {
        log.info("userId:{}", userId);

        return "doubi";
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

只是为了演示单元测试调用 service 中的方法,方法功能不重要。

编写对应的接口 IUserService.java

package com.doubibiji.hellospringboot.service;

public interface IUserService {

    /**
     * 测试方法
     */
    String getUserInfo(String userId);

}
1
2
3
4
5
6
7
8
9
10

# 2 测试service方法

在测试包下创建测试类:

在测试类中添加 @SpringBootTest 注解,直接注入 userService,并在测试方法上添加 @Test 注解,就可以运行测试方法进行运行了。

package com.doubibiji.hellospringboot;

import com.doubibiji.hellospringboot.service.IUserService;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class UserServiceTests {

    @Autowired
    private IUserService userService;

    @Test
    void contextLoads() {
        String info = userService.getUserInfo("001");
        System.out.println(info);

        // 还可以对返回结果进行断言,判断是否符合预期效果
        Assertions.assertEquals("niubi", info);
    }

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

在测试类中调用方法,还可以对返回的结果进行断言,如果不符合结果,会报错。