本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《 阿里云开发者社区用户服务协议 》和 《 阿里云开发者社区知识产权保护指引 》。如果您发现本社区中有涉嫌抄袭的内容,填写 侵权投诉表单 进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

classes 属性用来指定运行测试类需要装载的 class 集合,如果不指定,那么会默认装载 @SpringBootConfiguration 注解标注的类。

如果不指定classes属性,那么启动测试类时需要加载的Bean的数量和正常启动一次入口类加载的 Bean 数量是一样的。

如果你的项目中有很多个 Bean, 特别是有以下几种时:

  • 有 CommandLineRunner 的实现类
  • 用 @PostConstruct 注解指定了初始化方法的类
  • 这几种类在程序初始化的过程中都会运行自身的业务代码或者初始化代码,从而延后了测试方法的运行。

    在这种情况下,我们在编写测试类的时候,如果明确这个测试类会用到哪几个 Bean,则可以在 classes 属性处指定,之后启动测试类的时候,就只会加载需要的 Bean 到上下文中,从而加快启动速度。比如:

    MOCK, 启动一个模拟的 Servlet 环境, 默认值。

    RANDOM_PORT,启动一个 Tomcat 容器,并监听一个随机的端口号

    DEFINED_PORT,启动一个 Tomcat 容器,并监听配置文件中定义的端口(未定义则默认监听8080)

    NONE,不启动 Tomcat 容器

    怎么使用呢? 举个例子 如果你要测试的方法不需要用到 Tomcat 容器,比如:

    测试 DAO 类的CRUD

    测试Service 类的业务方法

    测试工具类的公用方法

    测试配置文件类是否读取到了正确的值

    只需要通过指定 @SpringBootTest(webEnvironment =

    SpringBootTest.WebEnvironment.NONE) 即可达到加速的效果。这时测试类启动时就只会初始化 Spring 上下文,不再启动 Tomcat 容器了:

    @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
    public class ArtisanServiceTests {
        @Autowired
        private IArtisanSerive artisanService;
        @Test
        public void test() {
            // ...