Предположим, что в приложении Spring Boot у меня есть тестовый application.yaml
файл в src/test/resources
, который содержит следующее определение свойства:
some:
property: ${some.property}
Также давайте предположим, что мой тестовый класс выглядит так:
@RunWith(SpringRunner.class)
@SpringBootTest
public class PortServiceTest {
@ClassRule
public static MyClassRule classRule = new MyClassRule()
@Autowired
private MyDependency dependency;
@Test
public void shouldPopulateEnvironmentWithWiremockPort() {
// test body
}
}
, где MyClassRule
имеет метод с именем ruleValue()
, который выполняет некоторые вычисления и возвращает заданное значение:
public class MyClassRule {
public int ruleValue() {
// some calculations
return value;
}
}
Я хочу установить значение ${some.property}
равным возвращаемому значению MyClassRule.ruleValue()
до того, как зависимости будут введены в тест и тесты начнутся - возможно, даже до инициализации контекста Spring.
Я подумал, что могу использовать пользовательский прослушиватель выполнения теста:
public class CustomTestExecutionListener extends AbstractTestExecutionListener {
@Override
public void beforeTestClass(TestContext testContext) throws Exception {
Class<?> testClass = testContext.getTestClass();
Field[] fields = testClass.getFields();
for (Field field : fields) {
if (field.getType() == MyClassRule.class) {
ClassRule annotation = field.getAnnotation(ClassRule.class);
if (annotation == null) {
continue;
}
MyClassRule myClassRule = (MyClassRule) field.get(testClass);
int ruleValue = myClassRule.ruleValue();
ApplicationContext context = testContext.getApplicationContext();
Environment environment = context.getEnvironment();
// how to set {some.value} in environment?
break;
}
}
}
}
но:
- Ко времени выполнения кода в слушателе выполнения теста контекст уже инициализирован, и у теста не будет возможности даже выполнить, так как
${some.property}
не может быть разрешен
- Я не уверен, как я могу ввести
${some.property}
в окружающую среду.
Так как же мне установить элегантное, прозрачное и многократно используемое значение ${some.property}
для возвращаемого значения MyClassRule.ruleValue()
?