2016-04-06 1 views
0

J'ai quelques services de printemps que je veux tester. Ces services créent une connexion (pooled BasicDataSource) au début et valide après que tous les DAOs ont été appelés avec succès.Spring Junit Transaction ne pas rollback après validation

Maintenant je veux les tester via Spring junit, mais le "commit" à la fin n'est pas annulé (même avec @Transactional). Comment cela peut-il être fait (j'ai lu que le printemps encapsule les méthodes en une seule transaction et les restaure)?

@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(); 
    } 

} 

Le jdbc.execute est annulée, mais le Connection récupéré par source de données ne sera pas annulée.

comment puis-je forcer une annulation même si je commet une connexion?

+2

Bien sûr, il ne sera pas ... Vous obtenez une connexion vous-même en dehors de la portée du printemps. Donc, pour la connexion gérée au printemps, il n'y a rien à annuler. –

+0

comment puis-je obtenir une connexion au printemps et le rendre? – Niko

+0

Utilisez le 'JdbcTemplate' ... Qu'est-ce que vous essayez de tester? –

Répondre

0

Comme l'a souligné @ M.Deinum Spring ne sait rien à propos de votre connexion (obtenu directement à partir de votre source de données) de sorte que vous ne pouvez pas s'attendre à ce qu'il annule quelque chose. Vous devez utiliser votre contexte printanier (et vos DAO gérés au printemps) pour exécuter vos tests. See this example.