2015-06-11 5 views
4

У меня есть такой простой класс для тестирования JUnit:Несколько пружинные источники данных для тестирования JUnit

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"classpath:/mysql-datasource-context.xml"}) 
public class EmployeeDAOTest { 

    @Autowired 
    EmployeeDao employeeDao; 

    @Test 
    public void findAllTest() { 
     assertTrue(employeeDao.findByName("noname").size() == 0); 
    } 
} 

Содержание MySQL-источника данных-context.xml выглядит следующим образом:

<context:component-scan base-package="my.packages.*"/> 

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
      <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
      <property name="url" value="jdbc:mysql://localhost:3306/project"/> 
      <property name="username" value="root"/> 
      <property name="password" value="root"/> 

    </bean> 


    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
      <property name="dataSource" ref="dataSource"/> 
      <property name="packagesToScan" value="my.packages.entity"/> 
      <property name="hibernateProperties"> 
       <props> 
         <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop> 
         <prop key="show_sql">true</prop> 
         <prop key="hibernate.hbm2ddl.auto">update</prop> 
       </props> 
      </property> 
    </bean> 

    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
      <property name="sessionFactory" ref="sessionFactory"/> 
    </bean> 

    <tx:annotation-driven transaction-manager="transactionManager"/> 

Теперь тест работает без проблем для моей базы данных mysql.

Дело в том, что у меня также есть база данных postgres, и мне нужен каждый тестовый запуск как для баз данных mysql, так и postgres.

Единственное решение, которое приходит на ум мой создает еще один тестовый класс с точно теми же тестами, но аннотация, как

@ContextConfiguration(locations = {"classpath:/postgres -datasource-context.xml"}) 

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

Есть ли лучший способ решить мою проблему?

ответ

1

Я думаю, что самое простое решение, чтобы сохранить тестовый класс в качестве основы один:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"classpath:/mysql-datasource-context.xml"}) 
public class EmployeeDAOTest { 

    @Autowired 
    EmployeeDao employeeDao; 

    @Test 
    public void findAllTest() { 
     assertTrue(employeeDao.findByName("noname").size() == 0); 
    } 
} 

, а затем создает один пустого подкласса для Postgres с его собственной конфигурацией:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"classpath:/postgres-datasource-context.xml"}, inheritLocations=false) 
public class EmployeeDAOTestPostgres extends EmployeeDAOTest { 
} 

Как и другие предлагаемые варианты, вы можете изменить конфигурационные файлы Spring, чтобы иметь только один; вы можете, например, поместить источник данных в отдельный контекст и импортировать его или использовать профиль (см. пример here)

+0

К сожалению, employeeDAO в родительском классе не поддерживается автоматически без аннотации ContextConfiguration в классе. –

+0

@ user2246018: вы правы, вы можете использовать mysql один в качестве базового класса и использовать пустой для postgres; Я обновил ответ – Giovanni

0

На первый взгляд это источник нескольких источников данных конфигурирования, на самом деле вы можете получить много сообщений для этого с помощью Google или быстро найти его в StackOverflow

Пример: Spring Boot Multiple Datasource

Другое решение, которое я могу изображение используя профиль пружины.

0

Я всегда нахожу, что лучше иметь верхний уровень приложения файла контекста, который включает в себя другие файлы:

-root.xml контекст приложения

<beans> 
    <import resource="appcontext-services.xml"/> 
    <import resource="appcontext-db.xml"/> 
</beans> 

Ваше приложение может запустить контекстное root.xml, но ваши тесты могут проверять один (или более) файлы нижнего уровня.

Если вы хотите заменяемый задний конец, вы можете рассмотреть использование PropertyPlaceHolderConfigurer.

например:

<import resource="appcontext-db-${vendor}.xml"/> 

И есть-дб контекста приложения-mysql.xml, контекст приложения-DB-postgres.xml вместе с System.setProperty("vendor", "mysql")

+0

Как это поможет мне запустить этот же тест с двумя разными источниками данных после друг друга во время пакета например, фаза? –

+0

@ContextConfiguration - просто удобство.Если вам нужен несколько контекстов для одного теста, вам может потребоваться явно использовать [ClassPathXmlApplicationContext] (http://docs.spring.io/spring-framework/docs/2.5.x/api/org/springframework/context/support/ ClassPathXmlApplicationContext.html). –

Смежные вопросы