2016-03-30 3 views
0

Я ожидаю, что данные будут записаны в базу данных после завершения метода с @Transactional. Является ли это допустимым предположением для моего теста JUnit при использовании базы данных HSQL. Я использую HSQL db для разработки и Oracle для моего развернутого приложения. Веб-приложение развернуто в WebSphere, разработанное в RSA. Ниже приводится краткое изложение моей конфигурации, включая POM и JUnit тест:Управление транзакциями не работает для весенних тестов

POM: 
3.2.9.RELEASE 
<groupId>org.mybatis</groupId> 
<artifactId>mybatis</artifactId> 
<version>3.2.3</version> 

<groupId>org.mybatis</groupId> 
<artifactId>mybatis-spring</artifactId> 
<version>1.2.1</version> 

APPLICATION CONTEXT: 
<!-- the bean for transaction manager for scoping/controlling the transactions --> 
<bean id="transactionManager" 
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <property name="dataSource" ref="dbDataSource" /> 
</bean> 
<tx:annotation-driven transaction-manager="transactionManager" /> 

<jee:jndi-lookup id="dbDataSource" jndi-name="jndi/HSQLDatasource" expected-type="javax.sql.DataSource" /> 

<!--Mapper--> 
<bean id="campaignMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> 
    <property name="mapperInterface" 
     value="com.abc.persistence.mapper.CampaignMapper" /> 
    <property name="sqlSessionTemplate"> 
     <bean class="org.mybatis.spring.SqlSessionTemplate"> 
      <constructor-arg index="0" ref="sqlSessionFactoryForBatch" /> 
      <constructor-arg index="1" value="BATCH" /> 
     </bean> 
    </property>  
</bean> 

<!-- SqlSessionFactory For Batch --> 
<bean id="sqlSessionFactoryForBatch" class="org.mybatis.spring.SqlSessionFactoryBean"> 
    <property name="dataSource" ref="dbDataSource" /> 
    <property name="typeAliasesPackage" value="com.abc" /> 
    <property name="mapperLocations" value="classpath*:com/mybatis/mappers/**/*.xml" /> 
</bean> 

JUNIT: 
//junit class extends a base class that initializes HSQL db 
//jdbcConnection.setAutoCommit(false); 

    @Autowired 
    CampaignMapper campaignMapper; 

    @Transactional 
    @Test 
    public void testInsert(){ 

     for(Campaign record:campaignsFromFile){ 
      record.setRowLastUpdateId(rowLastUpdateId); 
      record.setCampaignId(campaignId); 
      campaignMapper.insertCampaignRecord(record); 
     } 
     //At this point I expect that the data would NOT be written to the database 
     //other method code 

     }//end of method 
     //At this point I expect that the data would be written to the database 

ответ

2

По умолчанию Spring будет откатить транзакцию в тестовых условиях. Если это не поведение вы ожидаете, вы всегда можете использовать @Rollback аннотации с false значения:

@Transactional 
@Test 
@Rollback(false) 
public void testInsert() { ... } 

Если случайно вы используете релиз Spring 4.2.x, вы можете использовать новую @Commit аннотации, которая является новая аннотация, которая может использоваться как прямая замена для @Rollback(false). Вы можете узнать больше о Управление транзакциями in Контекст весеннего тестаhere.

+0

Мое предположение заключается в том, что записи не должны записываться в базу данных до тех пор, пока метод не завершится. Однако, если я запускаю отладку, поставьте точку останова после вставки и запросите базу данных после каждой вставки (в цикле), я вижу отдельные записи, записанные в базу данных один за другим. Я ожидаю, что они должны быть написаны только после завершения метода. Благодарим вас за понимание @Rollback, так как это будет полезно узнать после того, как я сначала исправлю эту другую проблему. – jimmy

+0

Затем удалите транзакции «Transactional» и «Rollback» и выполните транзакцию вручную, используя абстракцию TestTransaction. Вы можете использовать методы 'start',' end' и 'flagForCommit'. –

+0

Извините, но сейчас я смущен. Поэтому, если я прочитаю этот комментарий, я не смогу проверить свой код, поскольку я намерен его использовать. Я не могу использовать Transactional. Я должен заменить его TestTranaction. Я ожидал, что это аннотация для замещения Transactional для использования в тестах junit, но это, похоже, не так. Я искал помощь в TestTranaction, но ничего полезного не получил. Если это нечто совершенно иное, я не знаю, как я могу доверять своему коду, когда я его развертываю, если не могу проверить его поведение в моей среде разработки. – jimmy