java - starter - spring boot test repository
Revertir la transacción después de @Test (6)
En primer lugar, he encontrado muchos hilos en StackOverflow sobre esto, pero ninguno de ellos realmente me ayudó, así que lamento preguntar posiblemente una pregunta duplicada.
Estoy ejecutando pruebas JUnit usando spring-test, mi código se ve así
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {})
public class StudentSystemTest {
@Autowired
private StudentSystem studentSystem;
@Before
public void initTest() {
// set up the database, create basic structure for testing
}
@Test
public void test1() {
}
...
}
Mi problema es que quiero que mis pruebas NO influyan en otras pruebas. Entonces me gustaría crear algo así como deshacer para cada prueba. He buscado mucho para esto, pero no he encontrado nada hasta ahora. Estoy usando Hibernate y MySql para esto
Debe ejecutar su prueba con un contexto de sprint y un administrador de transacciones, por ejemplo,
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"/your-applicationContext.xml"})
@TransactionConfiguration(transactionManager="txMgr")
public class StudentSystemTest {
@Test
public void testTransactionalService() {
// test transactional service
}
@Test
@Transactional
public void testNonTransactionalService() {
// test non-transactional service
}
}
Vea el capítulo 10. Testing
de la referencia de resorte para más detalles.
Las respuestas que mencionan agregar @Transactional
son correctas, pero para simplificar, podría hacer que su clase de prueba extends AbstractTransactionalJUnit4SpringContextTests
.
Lo sé, estoy demasiado tarde para publicar una respuesta, pero espero que pueda ayudar a alguien. Además, acabo de resolver este problema que tuve con mis pruebas. Esto es lo que tuve en mi prueba:
Mi clase de prueba
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "path-to-context" })
@Transactional
public class MyIntegrationTest
Contexto xml
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
Todavía tenía el problema de que la base de datos no se limpiaba automáticamente.
El problema se resolvió cuando agregué la siguiente propiedad a BasicDataSource
<property name="defaultAutoCommit" value="false" />
Espero eso ayude.
Puede deshabilitar la reversión:
@TransactionConfiguration(defaultRollback = false)
Ejemplo:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@Transactional
@TransactionConfiguration(defaultRollback = false)
public class Test {
@PersistenceContext
private EntityManager em;
@org.junit.Test
public void menge() {
PersistentObject object = new PersistentObject();
em.persist(object);
em.flush();
}
}
Solo agrega la anotación @Transactional
encima de tu prueba:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"testContext.xml"})
@Transactional
public class StudentSystemTest {
Por defecto, Spring iniciará una nueva transacción en torno a su método de prueba y @Before
/ @Before
callbacks, retrocediendo al final. Funciona de manera predeterminada, es suficiente tener algún administrador de transacciones en el contexto.
De: 10.3.5.4 Gestión de transacciones (mina en negrita):
En el marco TestContext, TransactionalTestExecutionListener administra las transacciones. Tenga en cuenta que
TransactionalTestExecutionListener
está configurado de manera predeterminada , incluso si no declara explícitamente@TestExecutionListeners
en su clase de prueba. Sin embargo, para habilitar el soporte para las transacciones, debe proporcionar un beanPlatformTransactionManager
en el contexto de la aplicación cargado por la semántica de@ContextConfiguration
. Además, debe declarar@Transactional
a nivel de clase o método para sus pruebas .
Aparte: el intento de enmendar la respuesta de Tomasz Nurkiewicz fue rechazado:
Esta edición no hace que la publicación sea aún más fácil de leer, más fácil de encontrar, más precisa o más accesible. Los cambios son completamente superfluos o perjudican activamente la legibilidad.
link correcto y permanente a la sección relevante de la documentación sobre pruebas de integración.
Para habilitar el soporte para transacciones, debe configurar un bean
PlatformTransactionManager
en elApplicationContext
que se carga a través de la semántica de@ContextConfiguration
.
@Configuration @PropertySource("application.properties") public class Persistence { @Autowired Environment env; @Bean DataSource dataSource() { return new DriverManagerDataSource( env.getProperty("datasource.url"), env.getProperty("datasource.user"), env.getProperty("datasource.password") ); } @Bean PlatformTransactionManager transactionManager() { return new DataSourceTransactionManager(dataSource()); } }
Además, debe declarar la anotación
@Transactional
de Spring a nivel de clase o método para sus pruebas.
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = {Persistence.class, SomeRepository.class}) @Transactional public class SomeRepositoryTest { ... }
Anotar un método de prueba con
@Transactional
hace que la prueba se ejecute dentro de una transacción que, de forma predeterminada, se retrotraerá automáticamente después de la finalización de la prueba. Si una clase de prueba se anota con@Transactional
, cada método de prueba dentro de esa jerarquía de clase se ejecutará dentro de una transacción.