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..