Integrationstest für Datenbankzugriffe mit automatischem Rollback in Java EE

Das gleiche Verhalten wie im vorigen Beitrag mit Spring beschrieben, kann auch in Java EE durchgeführt werden: Vor jeder Testmethode starten wir eine Transaktion, nach Beendigung der Testmethode machen wir ein Rollback um die Daten wieder auf den vorherigen Zustand zurückzustellen.

Anders als in Spring müssen wir uns um die Transaktion selbst kümmern, was aber auch kein größeres Problem darstellt. Mittels der UserTransaction-Klasse (einer vom CDI vordefinierten Bean) können wir eine Transaktion in der @Before-Methode starten (diese wird vor jeder Test-Methode ausgeführt). Enterprise Java Beans (EJBs) haben standardmäßig einen Transaktions-Kontext. Erkennt eine EJB aber, dass schon eine Transaktion schon gestartet wurde, wird keine neue gestartet. Dadurch können wir alle unsere EJB-Aufrufe in der gleichen Transaktion laufen lassen und auf diese am Ende (am Besten in der @After-Methode) ein Rollback durchführen.

Hier ein kleines Beispiel dazu:

public class MyBeanTest {

    @Inject
    UserTransaction utx;

    @Before
    public void before() throws SystemException, NotSupportedException {
        utx.begin();
    }

    @After
    public void after() throws SystemException {
        utx.rollback();
    }

    @Test
    public void testSomething() {
       // some tests that will run in transactional context
    }
}

 

Schreibe einen Kommentar