Как протестировать mocking источник данных JNDI с помощью Spring?

Я довольно новичок в Spring и задаюсь вопросом, как создавать тесты JUnit, которые используют издевательский источник данных и как использовать контекст JNDI с этим? В настоящее время мое приложение использует контекст JNDI из tomcat для извлечения соединения и через это соединение извлекает данные из базы данных. Поэтому я предполагаю, что мне нужно издеваться над вызовами JNDI и извлечением данных. Любые хорошие указатели на то, что лучший способ справиться с этим, было бы здорово! Большое спасибо!

7 Solutions collect form web for “Как протестировать mocking источник данных JNDI с помощью Spring?”

Обычно я определяю свои зависимости JNDI в отдельном файле, например datasource-context.xml :

    

Так что в тестовых ресурсах я могу создать другой файл и определить тестовый источник данных, но он мне подходит, например, datasource-testcontext.xml :

    

И затем в моем тестовом classе я использую тестовую конфигурацию источника данных вместо производственной, которая зависит от JNDI:

 @ContextConfiguration({ "classpath*:META-INF/spring/datasource-testcontext.xml", "classpath*:META-INF/spring/session-factory-context.xml" }) public class MyTest { } к @ContextConfiguration({ "classpath*:META-INF/spring/datasource-testcontext.xml", "classpath*:META-INF/spring/session-factory-context.xml" }) public class MyTest { } к @ContextConfiguration({ "classpath*:META-INF/spring/datasource-testcontext.xml", "classpath*:META-INF/spring/session-factory-context.xml" }) public class MyTest { } 

Если источник данных не определен в отдельном файле, вы все равно можете заглушить объект, возвращаемый вызовами JNDI:

  • например: Инъецирование источников данных JNDI для тестов JUnit за пределами контейнера
  • или используя classы в пакете org.springframework.mock.jndi , т.е. SimpleNamingContextBuilder (есть пример в javadoc этого calass).

Вы можете использовать SimpleNamingContextBuilder, чтобы сделать доступным для ваших тестов источник данных jndi:

  SimpleNamingContextBuilder builder = new SimpleNamingContextBuilder(); builder.bind("java:comp/env/jdbc/mydatasource", dataSource); builder.activate(); 

https://fisheye.springsource.org/browse/spring-framework/spring-test/src/main/java/org/springframework/mock/jndi/SimpleNamingContextBuilder.java?hb=true

Это не совсем издевается над источником данных, но он делает источник данных доступным через jndi для ваших тестов.

Вы можете создать свой собственный mock DataSource, расширив SpringDataSource Spring.

 import java.sql.Connection; import java.sql.SQLException; import org.springframework.jdbc.datasource.AbstractDataSource; /** * Mock implementation of DataSource suitable for use in testing. * * */ public class MockDataSource extends AbstractDataSource { private Connection connection; /** * Sets the connection returned by javax.sql.DataSource#getConnection() * and javax.sql.DataSource#getConnection(java.lang.String, java.lang.String) * * @param connection */ public void setConnection(Connection connection) { this.connection = connection; } /* * (non-Javadoc) * @see javax.sql.DataSource#getConnection() */ public Connection getConnection() throws SQLException { return connection; } /* * (non-Javadoc) * @see javax.sql.DataSource#getConnection(java.lang.String, java.lang.String) */ public Connection getConnection(String username, String password) throws SQLException { return connection; } } 

Я бы отделил JNDI-поиск соединения от остальной части кода. Внедрите DataSource в свои объекты доступа к данным (DAO) и используйте MockDataSource для тестирования DAO.

Вы всегда можете создать конфигурацию beans.test.xml, где вы сначала ссылаетесь на beans.xml, а затем переопределяете конфигурацию источника данных:

SRC / главная / ресурсы / beans.xml

   

SRC / тест / ресурсы / beans.test.xml

   

Класс тестирования JUnit:

 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:/beans.test.xml" }) public class ASRTests { ... } 

В своем jndi bean, объявите ссылку

  

В тестовом компоненте объявите источник данных

  ...  

Имейте в виду переместить тестовый источник данных в тестовую папку.

Spring org.springframework.jndi.JndiObjectFactoryBean лучше всего подходит для поиска JNDI. Согласно своей документации, он позволяет вводить значения по умолчанию, а также для тестовых примеров весной.

Обратитесь к приведенной ниже конфигурации пружины (названной как spring-test-db-config.xml)

           

Добавить bean, определенный в другом файле конфигурации, относится к компоненту dataSourceFromJndi

     

Преимущество такого подхода заключается в том, что вы можете хранить 2 разных файла конфигурации DB – один для производства и другой для модульного тестирования. Просто импортируйте правильный. Конфигурация теста будет содержать объект по умолчанию.

Конфигурация Java …

Тест-драйв Junit

 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = {DatabaseConfigStub.class}, loader= AnnotationConfigContextLoader.class) public class DatabaseConfigTest { @Autowired private DataSource datasource; @Autowired private JdbcTemplate jdbcTemplate; @Before public void setUp() throws Exception { } @After public void tearDown() throws Exception { } @Test public void testDataSource() { assertNotNull(datasource); assertNotNull(jdbcTemplate); } } 

DatabaseConfigStub

 public class DatabaseConfigStub { private static final Logger log = Logger.getLogger(DatabaseConfigStub.class); private static final String DS_NAME = "jdbc/DS_NAME"; @Bean DataSource dataSource() { JndiObjectFactoryBean jndiObjectBean = EasyMock.createMock(JndiObjectFactoryBean.class); jndiObjectBean.setJndiName(DS_NAME); jndiObjectBean.setResourceRef(true); jndiObjectBean.setProxyInterfaces(DataSource.class); EasyMock.expect( (DataSource)jndiObjectBean.getObject()).andReturn(new DataSource() { public  T unwrap(Class iface) throws SQLException { // TODO Auto-generated method stub return null; } public boolean isWrapperFor(Class< ?> iface) throws SQLException { // TODO Auto-generated method stub return false; } public void setLoginTimeout(int seconds) throws SQLException { // TODO Auto-generated method stub } public void setLogWriter(PrintWriter out) throws SQLException { // TODO Auto-generated method stub } public int getLoginTimeout() throws SQLException { // TODO Auto-generated method stub return 0; } public PrintWriter getLogWriter() throws SQLException { // TODO Auto-generated method stub return null; } public Connection getConnection(String username, String password) throws SQLException { // TODO Auto-generated method stub return null; } public Connection getConnection() throws SQLException { // TODO Auto-generated method stub return null; } } ); EasyMock.replay(jndiObjectBean); return (DataSource) jndiObjectBean.getObject(); } @Bean JdbcTemplate jdbcTemplate(){ return new JdbcTemplate( dataSource()); } 

}

Вы также можете использовать Simple-JNDI. Это реализация JNDI в памяти для работы с контекстами JNDI за пределами контейнера J2EE. Он позволяет использовать один и тот же файл определения компонента в процессе производства и тестирования. Предположим, что это ваше определение bean-компонента в производстве:

       

Создайте файл свойств, подобный этому

 type=javax.sql.DataSource driverClassName=org.gjt.mm.mysql.Driver url=jdbc:mysql://localhost/testdb username=user_name password=password 

Поместите Simple-JNDI и файл jndi.properties с небольшой конфигурацией в вашем пути к classам. Затем обращайтесь к источнику данных, как обычно.

Подробнее о Simple-JNDI можно найти здесь.

  • Как определить и переключиться на кадр в веб-seleniumе, когда кадр не имеет идентификатора
  • Запуск приложения до и после Suite в jUnit 4.x
  • Как я могу создавать тесты в Android Studio?
  • Тестирование модhive Android Studio: чтение данных (ввода)
  • Автоматизированные тесты для Java Swing GUI
  • Как заставить Сикули работать в безголовом режиме
  • Как проверить производительность приложения для Android?
  • Зависимость от теста
  • Можно ли запустить несколько версий Google Chrome на одном компьютере? (Mac или Windows)
  • Как настроить JPA для тестирования в Maven
  • Раздельные сборки 'debug' и 'release'?
  • Interesting Posts

    Сценарий postinstall для Mac не запущен

    Удобный способ анализа входящих параметров multipart / form-data в Servlet

    bootsrap nav-bar collapsable не может заставить его работать

    Какие символы нужно избегать при использовании Bash?

    Как изменить поля печати по умолчанию для Google Chrome

    Windows 7: Любой способ отключить «показать caracter» в свойствах сети WIFI?

    Найдите личное поле с Reflection?

    Каковы местоположения различных файлов тем в Windows 7?

    Как получить доступ к моему локальному серверу на моей виртуальной машине VirtualBox?

    Есть ли бесплатная библиотека OCR для Android?

    Логические операторы (“и”, “или”) в партии DOS

    Как сохранить строку в текстовый файл с помощью Java?

    Сброс «Предупреждение HDD» с внешним корпусом Zalman ZM-VE400

    Как вы держите DVD-привод от открытия, когда вы получаете сообщение «пожалуйста, вставьте диск в дисковод»?

    java.lang.OutOfMemoryError: пространство кучи Java в Maven

    Давайте будем гением компьютера.