I'm trying to get JDBC transaction rollback when using Spring-test without success. When I run the following the SQL update is always committed.
package my.dao.impl;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestExecutionListeners;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
import org.springframework.test.context.transaction.TransactionConfiguration;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.Statement;
@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class})
@ContextConfiguration(locations={"classpath:ApplicationContext-test-DAOs.xml"})
@TransactionConfiguration(defaultRollback = true)
public class ConfirmationMatchingDAOImplTest {
@Autowired
private DataSource dataSource;
@Test
public void shouldInsertSomething() throws Exception {
final Connection connection = dataSource.getConnection();
final Statement statement = connection.createStatement();
statement.executeUpdate("insert into TEST_INSERT values (1, 'hello')");
statement.close();
connection.close();
}
}
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
<property name="url" value="jdbc:sqlserver://makeitfunky:1490;databaseName=fonzie"/>
<property name="username" value="ralph"/>
<property name="password" value="p0n1es_R_kew1"/>
</bean>
What am I doing wrong?
Additionally, am I using too many annotations? Can I make it a bit cleaner?
Annotation Type Rollback@Rollback is a test annotation that is used to indicate whether a test-managed transaction should be rolled back after the test method has completed.
In its default configuration, the Spring Framework's transaction infrastructure code only marks a transaction for rollback in the case of runtime, unchecked exceptions; that is, when the thrown exception is an instance or subclass of RuntimeException . ( Errors will also - by default - result in a rollback).
Add @Transactional(rollbackFor = Exception. class) to the top of the method. Spring will rollback all data within this transaction for you if any exception is thrown by database.
If you do not explicitly configure test execution listeners using the @TestExecutionListeners
annotation, Spring configures by default DependencyInjectionTestExecutionListener
, DirtiesContextTestExecutionListener
, and TransactionalTestExecutionListener
. TransactionalTestExecutionListener
provides transactional test execution with default rollback semantics. By explicitly declaring @TestExecutionListeners
on your test class and omitting TransactionalTestExecutionListener
from the listeners list, you are disabling transactional support.
You must also add the @Transactional
annotation at the class or method level.
You must also use DataSourceUtils to get a transactional Connection managed by DataSourceTransactionManager.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With