Как динамически установить значение свойства приложения Spring в тестовых примерах? - PullRequest
0 голосов
/ 23 июня 2019

Предположим, что в приложении 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;
            }
        }
    }
}

но:

  1. Ко времени выполнения кода в слушателе выполнения теста контекст уже инициализирован, и у теста не будет возможности даже выполнить, так как ${some.property} не может быть разрешен
  2. Я не уверен, как я могу ввести ${some.property} в окружающую среду.

Так как же мне установить элегантное, прозрачное и многократно используемое значение ${some.property} для возвращаемого значения MyClassRule.ruleValue()?

1 Ответ

1 голос
/ 23 июня 2019

Spring ReflectionTestUtils - это набор утилит, основанных на отражениях, для использования в сценариях модульного и интеграционного тестирования.

Используя ReflectionTestUtils.setField, вы должны иметь возможность установить поле (где вы вводите значение) со значением на"targetClass".

@Before
public void setup(){
ReflectionTestUtils.setField(classRule , "fieldName", value);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...