当前位置: 首页 > 知识库问答 >
问题:

测试后清除Spring应用程序上下文

高泳
2023-03-14
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = MyTest.ContextConfiguration.class)
public class MyTest{
   ...
   public static class ContextConfiguration {
     // beans defined here... 

   }
}

共有1个答案

裴鸿熙
2023-03-14

您已经两次声明@dirtiescontext(classMode=AFTER_EACH_TEST_METHOD)不起作用;但是,下面的说明表明它按文档的方式工作。

import javax.annotation.PreDestroy;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInfo;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.annotation.DirtiesContext.ClassMode;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;

@ExtendWith(SpringExtension.class)
@ContextConfiguration
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
class MyTest {

    @Test
    void test1(TestInfo testInfo) {
        System.err.println(testInfo.getDisplayName());
    }

    @Test
    void test2(TestInfo testInfo) {
        System.err.println(testInfo.getDisplayName());
    }

    @Configuration
    static class Config {

        @Bean
        MyComponent myComponent() {
            return new MyComponent();
        }
    }

}

class MyComponent {

    @PreDestroy
    void destroy() {
        System.err.println("Destroying " + this);
    }
}

执行上面的测试类会产生类似于以下内容的STDERR输出。

test1(TestInfo)
Destroying MyComponent@dc9876b
test2(TestInfo)
Destroying MyComponent@30b6ffe0

因此,@dirtiescontext(classMode=AFTER_EACH_TEST_METHOD)确实是“在每次测试执行后清除应用程序上下文”的方式。

因此,如果这在测试类中不起作用,那么这将是一个bug,您应该向Spring团队报告。

你有什么例子可以证明这不起作用吗?

仅供参考:使用classmode=before_class只有在上下文已经在当前执行的测试套件中创建的情况下才有意义。否则,您将指示Spring关闭并从不存在的缓存中删除applicationcontext。就在Spring真正创造它之前。

 类似资料:
  • 问题内容: 我有一个包含2个测试的测试类: 当我单独运行测试时,我不会出错,但是当我同时运行所有测试时,会失败。失败是由于某些测试修改了应用程序上下文导致的: 是否可以单独运行此测试?我只想在启动test1时读取所有必需的东西,然后运行测试,然后关闭所有必需的东西。然后启动test2。 问题答案: 您可以在修改应用程序上下文的测试类上使用@DirtiesContext批注。 Java文档 Spri

  • 问题内容: 我的WEB-INF目录下有一些XML文件: lyricsBaseApp-servlet.xml hibernate.xml dataSource.xml beans.xml servlet xml导入其他xml文件: 我希望我的junit4 类包含整个spring配置。使用默认文件名,我创建了一个文件。最后,我不知道该放在哪里… 我试过了: 要么 和其他一些想法,但都失败了。有人可以指

  • 我在我的src/test/resources路径中创建了一个application-integrationtest.yaml,所以我的测试是针对创建的docker TestContainer运行的。问题是没有加载我的application-integrationtest.yaml。 我正在运行一个SpringBoot2.x应用程序 原因:org.springframework.beans.Bean

  • 问题内容: 我有一堆JUnit测试用例(集成测试),它们在逻辑上分为不同的测试类。 我们能够为每个测试类加载一次Spring应用程序上下文,然后将其重新用于JUnit测试类中的所有测试用例 但是,我们只是想知道是否有一种方法可以对一堆JUnit测试类仅加载一次Spring应用程序上下文。 FWIW,我们使用Spring 3.0.5,JUnit 4.5并使用Maven构建项目。 问题答案: 是的,这

  • 我使用Spock框架和Groovy脚本来测试我的Java应用程序。对于我创建的所有类,我的项目有100%的测试覆盖率。然而,我注意到覆盖范围显示,名为“app”的主类没有得到充分测试。 这是我对App类的一个测试: 如何用Spock框架充分测试Spring Boot应用程序上下文?

  • 在运行每个测试类之前,有什么方法可以将应用程序上下文恢复到它的原始状态吗?我不想让“TrainingSessionServiceTest”类扩展AbstractTransactionalJunit4SpringContextTests。以下是我的应用程序上下文的相关部分: