UnitTest. Несколько баз данных. Собственный опыт


(Матвей Унесихин) #1

При работе с проектом, использующим несколько баз данных столкнулся с тем что для работы стандартных тестов требуется донастроить подключение второй базы данных. Так как для настройки тест контейнера у меня заняло достаточно много времени мне захотелось поделиться своим опытом, так как был близок просто задать вопрос.

По итогу требуется всего несколько действий:

  1. Получить дополнительные данные из context.xml. В тест контейнере просто переписываем в виде:

           private void initDbProperties() {
                 File contextXmlFile = new File("modules/core/web/META-INF/context.xml");
                 if (!contextXmlFile.exists()) {
                     contextXmlFile = new File("web/META-INF/context.xml");
                 }
                 if (!contextXmlFile.exists()) {
                     throw new RuntimeException("Cannot find 'context.xml' file to read database connection properties. " +
                             "You can set them explicitly in this method.");
                 }
                 Document contextXmlDoc = Dom4j.readDocument(contextXmlFile);
                 List<Element> elements = contextXmlDoc.getRootElement().elements("Resource");
                 for (int i = 0; i < elements.size(); i++) {
                     Element element = elements.get(i);
                     if (i == 0) {
                         dbDriver = element.attributeValue("driverClassName");
                         dbUrl = element.attributeValue("url");
                         dbUser = element.attributeValue("username");
                         dbPassword = element.attributeValue("password");
                     } else {
                         dbDopDriver = element.attributeValue("driverClassName");
                         dbDopUrl = element.attributeValue("url");
                         dbDopUser = element.attributeValue("username");
                         dbDopPassword = element.attributeValue("password");
                     }
                 }
             }
    
  1. В дочернем классе Common надо переопределить метод initDataSources()

     @Override
             protected void initDataSources() {
                 super.initDataSources();
                 try {
                     Class.forName(dbDopDriver);
                     TestDataSource ds = new TestDataSource(dbDopUrl, dbDopUser, dbDopPassword);
                     TestContext.getInstance().bind(AppContext.getProperty("cuba.dataSourceJndiName_DopDs"), ds);
                 } catch (ClassNotFoundException | NamingException e) {
                     throw new RuntimeException("Error initializing datasource", e);
                 }
             }
    

В общем то и все. Кстати на форуме предложил бы добавить раздел “Делимся опытом” или тп.

Для примера запилил тестовый проект https://github.com/UnMatty/multyDsExample


(Konstantin Krivopustov) #2

Матвей, спасибо!
Кстати на англоязычном форуме есть такой раздел: https://www.cuba-platform.com/discuss/c/community-how-tos
Давайте подождем пока здесь накопится хотя-бы еще пара подходящих тем, и тогда откроем аналогичный раздел.