Как запустить код перед инициализацией контекста 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() {
...
}
}
может быть, это помогает, кто-то, когда-то, где-то ;)