2016-04-06 162 views
0

私はテストしたいSpringサービスをいくつか持っています。これらのサービスは、最初に接続(プールされたBasicDataSource)を作成し、すべてのDAOが正常に呼び出された後にコミットします。Spring Junit Transactionはコミット後にロールバックされません

私はSpring junitでテストしたいが、最後の "commit"はロールバックされない(@Transactionalでも)。

これはどのように行うことができますか(私はそのバネのメソッドを1つのトランザクションにカプセル化してロールバックしています)

@RunWith(SpringJUnit4ClassRunner.class) 
//@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, TransactionalTestExecutionListener.class }) 
@ContextConfiguration(locations = { "classpath:TestProject-spring-test.xml" }) 
@Transactional 
public abstract class BaseTest { 

    @Autowired 
    protected BasicDataSource dataSource; 

    @Autowired 
    protected JdbcTemplate jdbc; 


    @Test 
    @Rollback(true) 
    public void testTransactional() throws SQLException{ 
     jdbc.execute("INSERT INTO test (pk) VALUES (0)"); 

     Connection con = dataSource.getConnection(); 
     Statement stmt = con.createStatement(); 
     stmt.executeUpdate("INSERT INTO test (pk) VALUES (1)"); 
     con.commit(); 
     con.close(); 
    } 

} 

jdbc.executeがロールバックされるが、データソースによって取得Connectionはロールバックされていません。

私はConnectionをコミットしてもロールバックを強制できますか?

+2

もちろん、それはしません...あなたは春の範囲外で自分で接続しています。だから、春に管理された接続の場合、ロールバックするものはありません。 –

+0

どうすれば春までに接続して戻すことができますか? – Niko

+0

'JdbcTemplate'を使用してください...あなたは何をテストしようとしていますか? –

答えて

0

@MeDeinumが指摘しているように、Springはあなたの接続(データソースから直接取得)について何も知らないので、何かをロールバックすることは期待できません。テストを実行するには、スプリングコンテキスト(およびスプリング管理されたDAO)を使用する必要があります。 See this example

関連する問題