0

I am currently working on code coverage for a project that I haven't worked on. Here is sample code of it:

public class JmsMessageGateway extends AbstractMessageGateway {

    private CachingConnectionFactory cachingConnectionFactory;
 
    public void send() {
        createAmqpConnection();
        ...//try send message
        if(//if failed) {
            restartConnection();
        }
    }

    private void createAmqpConnection() throws JMSException {
        amqpJmsConnection = cachingConnectionFactory.createConnection();
        amqpJmsConnection.start();
    }

    private void restartConnection() throws JMSException {
        recreateConnection();
    }

    private void recreateConnection() throws JMSException {
        cachingConnectionFactory = cachingConnectionFactory();
        createAmqpConnection();
    }

    private CachingConnectionFactory cachingConnectionFactory() {
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
        connectionFactory.setTargetConnectionFactory(jmsConnectionFactory());
        return connectionFactory;
    }

    private JmsConnectionFactory jmsConnectionFactory() {
        ... //do some configuration stuff
        return connectionFactory;
    }

In order to unit test recreateConnection, my unit test is doing something like this:

    @Before
    public void setup() throws JMSException {
        ...
        when(connectionFactory.createConnection()).thenReturn(amqpJmsConnection);
        ...
    }

So when send() is called, amqpJmsConnection is set by cachingConnectionFactory.createConnection();. This .createConnection() will fail if not mocked since connection properties are test values.

Problem is when I test restartConnection. In cachingConnectionFactory(), it reinitialize CachingConnectionFactory object and set to local cachingConnectionFactory object, so when createAmqpConnection(); is called, cachingConnectionFactory object is NOT mocked object in cachingConnectionFactory.createConnection();.

I tried Powermock but was having problems, and I don't prefer using Powermock. How can I test restartConnection() without refactoring the class (which I am thinking about doing it).

Edit: I tried creating builder pattern for CachingConnectionFactory so I can mock each time cachingConnectionFactoryBuilder.build() is called, but it doesn't make sense to create builder just for unit test..

Jonathan Hagen
  • 580
  • 1
  • 6
  • 29
  • Does this answer your question? [Why is my class not calling my mocked methods in unit test?](https://stackoverflow.com/questions/74027324/why-is-my-class-not-calling-my-mocked-methods-in-unit-test) – knittl Nov 04 '22 at 17:38

0 Answers0