How do I mock a TransactionManager in a JUnit test, (outside of the container)?
Asked Answered
B

3

15

I'm using Spring 3.1.0.RELEASE, JUnit 4.8.1, and ultimately deploying my application to a JBoss 4.2 server (I know, I know). As part of setting up my unit test, I have this in my Spring test application context ...

<bean id="transactionManager"  
    class="org.springframework.transaction.jta.JtaTransactionManager">
        <property name="userTransactionName">
        <value>UserTransaction</value>
    </property> 
</bean>

Of course, right now this fails because there is nothing bound to the JNDI name, "UserTransaction." How do I mock a transaction manager? I'm using the org.mockejb framework but an open to any suitable mocking frameworks.

Boreal answered 2/8, 2012 at 18:7 Comment(0)
S
15

We simply create an empty implementaion for the transaction manager, and ensure that this implementation is used in the spring-context used by the unit test

package sample;

import org.springframework.stereotype.Service;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionException;
import org.springframework.transaction.TransactionStatus;

public class MockedTransactionManager implements PlatformTransactionManager {

    @Override
    public TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException {
        return null;
    }

    @Override
    public void commit(TransactionStatus status) throws TransactionException {

    }

    @Override
    public void rollback(TransactionStatus status) throws TransactionException {

    }

}

.. and in the spring-xml file then looks like..

<bean id="transactionManager" class="sample.MockedTransactionManager"/>
Salomie answered 21/3, 2013 at 11:33 Comment(0)
S
3

You can also use Mockito:

PlatformTransactionManager manager = mock(PlatformTransactionManager.class);
Surmise answered 27/5, 2020 at 11:29 Comment(0)
D
2

You can use PseudoTransactionManager:

PlatformTransactionManager manager = new PseudoTransactionManager();
Dory answered 12/4, 2021 at 9:6 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.