¿Cómo deshacer una transacción de base de datos al probar servicios con Spring en JUnit?

No tengo problemas para probar mi DAO y mis servicios, pero cuando lo prueboINSERTs oUPDATEs Quiero revertir la transacción y no afectar mi base de datos.

Estoy usando@Transactional dentro de mis servicios para gestionar transacciones. Quiero saber, ¿es posible saber si una transacción estará bien, pero deshacerla para evitar alterar la base de datos?

Esta es mi prueba:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:/META-INF/spring.cfg.xml")
@TransactionConfiguration(defaultRollback=true)
public class MyServiceTest extends AbstractJUnit38SpringContextTests  {
    @Autowired
    private MyService myService;

    @BeforeClass
    public static void setUpClass() throws Exception {
    }

    @AfterClass
    public static void tearDownClass() throws Exception {
    }

    @Test
    public void testInsert(){
        long id = myService.addPerson( "JUNIT" );
        assertNotNull( id );
        if( id < 1 ){
            fail();
        }
    }
}

El problema es que esta prueba fallará porque la transacción fue revertida, ¡pero la inserción está bien! Si quito@TransactionConfiguration(defaultRollback=true) luego la prueba pasa pero se insertará un nuevo registro en la base de datos.

@Test
@Transactional
@Rollback(true)
public void testInsert(){
    long id = myService.addPerson( "JUNIT" );
assertNotNull(id);
if( id < 1 ){
        fail();
    }
}

Ahora puede probar pasar correctamente, pero se ignora la reversión y el registro se inserta en la base de datos. He anotado el métodoaddPerson() dentro de myService con@Transactionalobviamente ¿Por qué se ignora la reversión?

Respuestas a la pregunta(4)

Su respuesta a la pregunta