Как запустить код перед инициализацией контекста SpringJUnit4ClassRunner?

в моем приложении я инициализирую свойство перед запуском весеннего приложения следующим образом:

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

(просто для справки: он используется для log4j2 logging, который должен быть установлен до начала инициализации spring).

теперь я хочу запустить @IntegrationTest, но используйте ту же конфигурацию ведения журнала. Очевидно, я не могу использовать код выше, как JUnit тест не выполняется с помощью SpringApplication.run.

Итак, как я мог инициализировать код перед @RunWith(SpringJUnit4ClassRunner.class) начинается?

Примечание: BeforeClass не работает, так как это выполняется после запуска контекста spring.

2 ответов


вы можете запустить инициализацию в статическом инициализаторе. Статический инициализатор будет запущен после загрузки JUnit тестового класса и до того, как JUnit прочитает любые аннотации на нем.

в качестве альтернативы вы можете расширить SpringJUnit4ClassRunner с вашим собственным бегуном инициализировать в нем сначала, а затем запустить SpringJUnit4ClassRunner


у меня была немного другая проблема. Мне нужно развернуть что-то в моей службе после загрузки контекста 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() {
      ...
  }
}

может быть, это помогает, кто-то, когда-то, где-то ;)