Testcontainers providing connection to ibm/mq

425 Views Asked by At

I got following service bean that picks up connection and destination from JBoss standalone configuration file when deployed.

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;

@Stateless
public class MessageSenderImpl {

    @Resource(lookup = "java:jboss/ConnectionFactory")
    private ConnectionFactory connectionFactory;

    @Resource(lookup = "java:jboss/to")
    private Destination destination;
    
    public void send(List<OutboundMessage> omms) {
        if (omms.isEmpty())
            return;
        try {
            Connection connection = connectionFactory.createConnection();
            try {
                Session session = connection.createSession(true, 0);
                try {
                    MessageProducer producer = session.createProducer(destination);
                    try {
                        for (OutboundMessage omm : omms) {
                            String text = omm.getText();
                            TextMessage message = session.createTextMessage(text);
                            producer.send(message);
                        }
                    } finally {
                        producer.close();
                    }
                } finally {
                    session.close();
                }
            } finally {
                connection.close();
            }
        } catch (JMSException e) {
            throw new RuntimeException(e);
        }
    }
}

How do I write test case so that it picks up the connection to the testscontainer?

@Testcontainers
class MQTests {

    private static final MessageSenderImpl messageSender = new MessageSenderImpl();

    @Container
    static GenericContainer<?> mqContainer = new GenericContainer<>(DockerImageName.parse("ibmcom/mq"))
            .withEnv("LICENSE", "accept")
            .withEnv("MQ_QMGR_NAME", "test")
            .withEnv("MQ_USER_NAME","admin")
            .withEnv("JMS_QUEUES", "To")
            .withEnv("JMS_QUEUES", "From")
            .withExposedPorts(1414);

    @Test
    void test1() {
        assertTrue(mqContainer.isRunning());
        messageSender.send(new OutboundMessage("test"));
    }
}

I got similar service bean implementation for mail.

@Stateless
public class MailServiceImpl implements MailService {

    @Resource(mappedName = "java:jboss/mail/Default")
    private Session mailSession;

    public SendResult send(String toEmail, String subject, String body) {
        ...
    }

}

Inside tests Session resource to the testscontainer has been provided like below:

@Testcontainers
public interface MailContainer {
    
    private MailService mailService = new MailServiceImpl();

    int SMTP_PORT = 3025;
    int IMAP_PORT = 3143;

    @Container
    GenericContainer mailServer = new GenericContainer(DockerImageName.parse("greenmail/standalone"))
            .withExposedPorts(SMTP_PORT, IMAP_PORT);
            
    @Test
    void testSendMail() throws Exception {
        // Set system properties or environment variables
        System.setProperty("mail.smtp.host", mailServer.getHost());
        System.setProperty("mail.smtp.port", String.valueOf(mailServer.getMappedPort(SMTP_PORT)));

        // Send the mail
        String toEmail = "[email protected]";
        String subject = "Test Subject";
        String body = "Test Body";
        MailService.SendResult result = mailService.send(toEmail, subject, body);

        // Assert the mail was sent successfully
        assertEquals(MailService.SendResult.OK, result);
}

And it works, is it possible to do the same for mq connection as shown with mail? Or I should I be looking to other aproaches?

0

There are 0 best solutions below