artem-val81 / SBInduction

Ecommerce Application Backend using JAVA and Spring Boot. Использует различные реализации, такие как безопасность, микросервисы, AWS S3, REST API и различные другие функции. Все серверные возможности необходимы в соответствии с предоставленными задачами. Я прошу помощи у сообщества. Спасибо.
0 stars 0 forks source link

Override default Spring-Boot application.properties settings in Junit Test #4

Open artem-val81 opened 2 days ago

artem-val81 commented 2 days ago

У меня есть приложение Spring-Boot, где настройки по умолчанию установлены в файле application.properties в classpath (src/main/resources/application.properties).

Я хотел бы переопределить некоторые настройки по умолчанию в моем JUnit тесте с помощью свойств, объявленных в файле test.properties (src/test/resources/test.properties).

Сначала я думал, что использование @PropertySource("classpath:test.properties") в классе TestConfig решит проблему, но эти свойства не перезаписывают настройки application.properties (см. Spring-Boot Reference Doc - 23. Externalized Configuration). Затем я попробовал использовать -Dspring.config.location=classpath:test.properties при вызове теста. Это сработало - но я не хочу устанавливать это системное свойство для каждого выполнения теста. Должно быть простое решение, как переопределить настройки application.properties в JUnit тестах с помощью test.properties, которое я, должно быть, упустил.

nihad-ismayilov commented 1 day ago

Вы можете использовать @TestPropertySource для переопределения значений в application.properties. Из его JavaDoc: тестовые источники свойств могут использоваться для выборочного переопределения свойств, определенных в системных и приложения источниках свойств. Например:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = ExampleApplication.class)
@TestPropertySource(locations="classpath:test.properties")
public class ExampleApplicationTests {

}
artem-val81 commented 1 day ago

Верно. К сожалению, это не работает при использовании на ExampleApplication.class, поэтому я должен устанавливать его на каждом тестовом классе. Так ли это?

nihad-ismayilov commented 12 hours ago

Это должно быть где-то в иерархии тестового класса, то есть вы можете использовать общий суперкласс для настройки этого параметра в нескольких различных тестовых классах.

Также обратите внимание, что @TestPropertySource может принимать аргумент properties для переопределения некоторых свойств прямо в коде, например @TestPropertySource(properties = "myConf.myProp=valueInTest"), это полезно в случае, если вы не хотите создавать полностью новый файл свойств.