2016-03-30 11 views
0

@Transactionalのメソッドが完了した後に、データがデータベースに書き込まれることが期待されます。これは、HSQLデータベースを使用しているときの私のJUnitテストの正当な前提ですか?開発用にはHSQL DBを、配備済みアプリケーションにはOracleを使用しています。 RSAで開発されたWebSphereにデプロイされたWebアプリケーション。 は以下POMとJUnitテストを含め、私の設定の要約です:デフォルトではトランザクション管理がSpringテストで動作しないようです

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

は、春はテストコンテキストでトランザクションをロールバックします。万が一、あなたが春の4.2.xではリリースを使用している場合

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

、あなたは新しい@Commit注釈を使用することができます。これは、あなたが期待する行動ではない場合、あなたは常にfalse値で@Rollbackアノテーションを使用することができます@Rollback(false)の直接の代替として使用される新しい注釈。 トランザクション管理の詳細はで、Springテストコンテキストhereを参照してください。

+0

私の予想は、メソッドが終了するまでレコードをデータベースに書き込まないようにすることです。しかし、私はデバッグで実行する場合は、挿入後にブレークポイントを入れ、(ループ内の)挿入ごとにデータベースを照会すると、データベースに書き込まれた個々のレコードが1つずつ表示されます。私の期待は、メソッドが完了した後にのみ記述されるべきだということです。 @Rollbackに関する洞察をいただきありがとうございます。私はこの他の問題を最初に修正した後に知っておくと便利です。 – jimmy

+0

その後、 'Transactional'と' Rollback'を削除し、 'TestTransaction'抽象化を使ってトランザクションを手動で管理します。 'start'、' end'、 'flagForCommit'メソッドを使うことができます。 –

+0

申し訳ありませんが、今は混乱しています。だから私はこのコメントを正しく読めば私はそれを使用しようとしている私のコードをテストすることはできません。私はトランザクションを使用することはできません。私はそれをTestTranactionに置き換える必要があります。私はこれがjunitテストでのTransactional用の直接的な置換アノテーションだと思っていましたが、そうは思われません。私はTestTranactionの助けを捜したが、役に立たなかった。それが全く異なる場合は、開発環境での動作を調べることができない場合、どのように展開すれば自分のコードに自信を持てるか分かりません。 – jimmy

関連する問題