Zunächst habe ich auf StackOverflow viele Threads dazu gefunden, aber keiner von ihnen hat mir wirklich geholfen. Es tut mir leid, möglicherweise doppelte Fragen zu stellen.
Ich führe JUnit-Tests mit Spring-Test aus. Mein Code sieht so aus
@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() {
}
...
}
Mein Problem ist, dass meine Tests andere Tests NICHT beeinflussen sollen. Ich möchte also für jeden Test so etwas wie ein Rollback erstellen. Ich habe viel danach gesucht, aber bisher nichts gefunden. Ich benutze dafür Hibernate und MySql
initTest
Antworten:
Fügen Sie einfach eine
@Transactional
Anmerkung zu Ihrem Test hinzu:@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"testContext.xml"}) @Transactional public class StudentSystemTest {
Standardmäßig startet Spring eine neue Transaktion rund um Ihre Testmethode und
@Before
/ oder@After
Rückrufe, die am Ende zurückgesetzt wird. Es funktioniert standardmäßig, es reicht aus, einen Transaktionsmanager im Kontext zu haben.Von: 10.3.5.4 Transaktionsmanagement (fett gedruckt ):
quelle
PlatformTransactionManager
. Wie wird Spring sonst von Ihren Transaktionen und Ihrer Datenbank erfahren?@Transactional
auf@Test
Methodenebene und nicht auf Klassenebene.Nebenbei : Der Versuch, die Antwort von Tomasz Nurkiewicz zu ändern, wurde abgelehnt:
Korrekter und dauerhafter Link zum entsprechenden Dokumentationsabschnitt über Integrationstests.
quelle
Die Antworten, in denen das Hinzufügen erwähnt wird,
@Transactional
sind korrekt, aber der Einfachheit halber könnten Sie einfach Ihre Testklasse habenextends AbstractTransactionalJUnit4SpringContextTests
.quelle
Ich weiß, ich bin zu spät, um eine Antwort zu posten, aber ich hoffe, dass es jemandem helfen könnte. Außerdem habe ich gerade dieses Problem gelöst, das ich mit meinen Tests hatte. Folgendes hatte ich in meinem Test:
Meine Testklasse
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "path-to-context" }) @Transactional public class MyIntegrationTest
Kontext 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>
Ich hatte immer noch das Problem, dass die Datenbank nicht automatisch bereinigt wurde.
Das Problem wurde behoben, als ich BasicDataSource die folgende Eigenschaft hinzufügte
<property name="defaultAutoCommit" value="false" />
Ich hoffe es hilft.
quelle
Sie müssen Ihren Test mit einem Spring-Kontext und einem Transaktionsmanager ausführen, z.
@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 } }
3.5.8. Transaction Management
Weitere Einzelheiten finden Sie im Kapitel der Federreferenz.quelle
Zusätzlich zur Add-
@Transactional
On-@Test
Methode müssen Sie auch hinzufügen@Rollback(false)
quelle
Sie können den Rollback deaktivieren:
@TransactionConfiguration(defaultRollback = false)
Beispiel:
@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(); } }
quelle