Я создаю тестовые классы JUnit4, которые проверяют функциональность DAO, развернутых в контейнере SpringBoot. Проблема, с которой я столкнулся, заключается в разработке чистого способа тестирования одного и того же DAO на нескольких платформах баз данных, поскольку это приложение будет развернуто на Oracle, SQLServer & Postgres. DAO автоматически подключаются с использованием JDBCTemplate, свойства которого определены в файле application.properties.
Простой пример моего теста выглядит следующим образом:
@SpringBootTest
@TestPropertySource(locations = "classpath:/dao-test-oracle.properties")
public class UserDaoImplTester {
@Autowired
UserDao userDao;
private TestContextManager testContextManager;
public UserDaoImplTester() {
}
@Before
public void setup() throws Exception {
this.testContextManager = new TestContextManager(getClass());
this.testContextManager.prepareTestInstance(this);
}
@Test
public void testGetUser() {
User user = this.userDao.getUser("BLAH");
assertEquals("XYZAL", user.getAlias());
}
}
У меня есть проблема в том, что это использует фиксированный файл TestPropertySource для переопределения файлов в application.properties для указания на тестовую базу данных. Мне нужно иметь возможность указать альтернативные свойства для других баз данных, снова выполняя тесты.
Я рассмотрел следующие обходные пути, но у каждого есть свои минусы:
- создайте отдельный тестер подкласса для каждой базы данных и укажите соответствующий источник свойства теста. Это означает, что 4 тестовых класса на DAO
- Создание отдельных application.profiles для каждого тестового сценария, например application- oracle -test.properties; application-sqlserver-test.properties et c. Но я прочитал по другому тикету ( входящая ссылка, когда я нахожу его ), что вы не используете профили для этого сценария.
В идеале я хотел бы, чтобы быть в состоянии передать в отдельное местоположение TestPropertySource в JVM для каждого теста. Таким образом, я мог бы запустить их из IDE или передать их как часть цикла тестирования maven.
ASIDE: В данный момент база данных будет предварительно заполнена необходимыми данными тестирования, чтобы getxx (..) методы могут быть проверены, чтобы они возвращали правильные объекты. В конечном итоге база данных будет загружена с тестовыми данными с использованием DBUnit - я создал тестовые фреймы, отличные от SpringBoot, до которых успешно это делал.