【问题标题】:How to run code before SpringJUnit4ClassRunner context initialization?如何在 SpringJUnit4ClassRunner 上下文初始化之前运行代码?
【发布时间】:2015-03-26 09:16:40
【问题描述】:

在我的应用程序中,我在 spring 应用程序启动之前初始化了一个属性,如下所示:

MapLookup.setMainArguments(new String[] {"logging.profile", profile}); //from args
SpringApplication.run(source, args);

(仅供参考:用于log4j2日志记录,必须在spring开始初始化之前设置)。

现在我想运行@IntegrationTest,但使用相同的日志记录配置。显然我不能使用上面的代码,因为 JUnit 测试不是使用 SpringApplication.run 执行的。

那么,如何在@RunWith(SpringJUnit4ClassRunner.class) 启动之前初始化代码?

注意:BeforeClass 不起作用,因为这是在 spring 上下文启动后执行的。

【问题讨论】:

    标签: java spring junit spring-test


    【解决方案1】:

    您可以在静态初始化程序中运行初始化。静态初始化器将在 JUnit 加载测试类之后和 JUnit 读取其上的任何注释之前运行。

    或者,您可以先扩展 SpringJUnit4ClassRunner,并在其中初始化您自己的 Runner,然后再运行 SpringJUnit4ClassRunner

    【讨论】:

    • 您的意思是测试类中的static { } 块?我刚试过,但没有成功。
    • 我也试过了,它明显在SpringJUnit4ClassRunner之前运行,JUnit在加载测试类之前无法知道SpringJUnit4ClassRunner,一旦加载了类就会运行静态{}
    • 嗯,好的,它在 ClassRunner 之前运行,但在 log4j 初始化之后运行...所以我认为这 is 实际上确实是 log4j 问题?
    • log4j 初始化仅在某些代码使用它时运行,可能在您运行测试之前某些代码已在某处完成
    • 我也尝试将静态块移动到扩展的SpringJUnit4ClassRunner,但得到了相同的结果。奇怪的是 log4j 实际上在 ClassRunner 之前运行,因为从 static void main 运行时,log4j 配置首先在 SpringApplication.run 上初始化。
    【解决方案2】:

    我遇到了一个稍微不同的问题。加载 Spring 上下文后,我需要为我的服务部署一些东西。解决方案使用自定义配置类进行测试并在 @PostConstruct 方法中运行部署。

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = TestConfig.class, loader = AnnotationConfigContextLoader.class)
    public class JunitTest {
    
      @Configuration
      @ComponentScan(basePackages = { "de.foo })
      public static class TestMConfig {
    
          @Autowired
          private DeploymentService service;
    
    
          @PostConstruct
          public void init() {
            service.deploy(...);
          }
      }
    
      @Test
      public void test() {
          ...
      }
    }
    

    也许这对某人、某个时间、某处有帮助;)

    【讨论】:

      猜你喜欢
      • 2012-07-21
      • 1970-01-01
      • 2011-12-05
      • 1970-01-01
      • 2018-09-02
      • 1970-01-01
      • 1970-01-01
      • 2020-08-22
      • 2011-11-25
      相关资源
      最近更新 更多