13 Haziran 2023 Salı

Artemis EmbeddedActiveMQResource Sınıfı - Unit Test İçindir

Giriş
Şu satırı dahil ederiz
import org.apache.activemq.artemis.junit.EmbeddedActiveMQResource;
Açıklaması şöyle
Run a Server, without the JMS manager
Açıklaması şöyle
EmbeddedActiveMQResource is a class provided by the artemis-junit dependency, which allows you to easily set up an embedded ActiveMQ Artemis server for unit testing.
Maven
Şu satırı dahil ederiz. 
1. artemis-jakarta-server birim test içinde ActiveMQConnectionFactory gibi sınıfları kullanmak için gerekir. Yani parent POM gibi düşünülebilir. Kodu burada. İçinden artemis-junit çıkmıyor. Dolayısıyla bunu eklemek lazım
2. artemis-junit içinde bazı şeyleri dışarıda bırakmak gerekiyor, çünkü bu kütüphane güncellenmemiş ve javax.jms isim alanındaki sınıfları da getiriyor. Ama biz jakarta.jms isim alanını kullanmak istiyoruz
<dependency>
  <groupId>org.apache.activemq</groupId>
  <artifactId>artemis-jakarta-server</artifactId>
  <version>5.15.11</version>
  <type>pom</type>
  <scope>test</scope>
</dependency>

<dependency>
  <groupId>org.apache.activemq</groupId>
  <artifactId>artemis-junit</artifactId>
  <version>5.15.11</version>
  <scope>test</scope>
  <!-- Exclude dependencies that bring in jms namespace -->
  <exclusions>
    <exclusion>
      <groupId>org.apache.activemq</groupId>
      <artifactId>artemis-jms-client</artifactId>
    </exclusion>
  </exclusions>
</dependency>
createQueue metodu
Örnek
JUnit4 ile şöyle yaparız
public class MyTest {
  @Rule
  public EmbeddedActiveMQResource server = new EmbeddedActiveMQResource();

  @Test
  public void myTest() {
    // test something, eg. create a queue
    server.createQueue("test.adress", "test.queue");
  }
}
JUnit5 ile şöyle yaparız
public class MyTest {
   @RegisterExtension
   public EmbeddedActiveMQExtension server = new EmbeddedActiveMQExtension();

   @Test
   public void myTest() {
     // test something, eg. create a queue
     server.createQueue("test.adress", "test.queue");
   }
}
getVmURL metodu
Örnek
Şöyle yaparız. Burada createSession(false,Session.AUTO_ACKNOWLEDGE) ile transaction kullanmayan ve hemen onaylanan bir Session başlatılıyor
import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory;
import org.apache.activemq.junit.EmbeddedActiveMQBroker;

import jakarta.jms.Connection;
import jakarta.jms.ConnectionFactory;
import jakarta.jms.JMSException;
import jakarta.jms.MessageProducer;
import jakarta.jms.Queue;
import jakarta.jms.Session;
import jakarta.jms.TextMessage;
import static org.junit.Assert.assertNotNull;

public class ArtemisUnitTest {
  @Rule
  public EmbeddedActiveMQBroker broker = new EmbeddedActiveMQBroker();
  @Test
  public void testSendMessage() throws JMSException {
    ConnectionFactory connectionFactory = createConnectionFactory();
    try (Connection connection = connectionFactory.createConnection()) {    
      Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
      Queue queue = session.createQueue("exampleQueue");
      MessageProducer producer = session.createProducer(queue);
      TextMessage message = session.createTextMessage();
      message.setText("Hello, Artemis!");
      producer.send(message);
      // Verify that the message was sent successfully
      assertNotNull(message.getJMSMessageID());
    }
  }
  private ConnectionFactory createConnectionFactory() {
    String brokerUrl = broker.getVmURL();
return new ActiveMQConnectionFactory(brokerUrl); } }
Örnek
Şöyle yaparız. Burada createSession(false,Session.DUPS_OK_ACKNOWLEDGE) ile transaction kullanmayan ve mesajların çift gelebileceği bir Session başlatılıyor
import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory;
import org.apache.activemq.artemis.jms.client.ActiveMQXAConnectionFactory;
import org.apache.activemq.junit.EmbeddedActiveMQBroker;

import jakarta.jms.Connection;
import jakarta.jms.ConnectionFactory;
import jakarta.jms.JMSException;
import jakarta.jms.Message;
import jakarta.jms.MessageConsumer;
import jakarta.jms.Session;
import jakarta.jms.TextMessage;

public class ArtemisUnitTest {
  @ClassRule
  public static EmbeddedActiveMQResource broker = new EmbeddedActiveMQResource();

  @Test
  public void foo () {
    try (
      Connection connection = new ActiveMQConnectionFactory(broker.getVmURL())
        .createConnection();
      Session session = connection.createSession(false, Session.DUPS_OK_ACKNOWLEDGE);
      MessageConsumer consumer = session
        .createConsumer(session.createQueue(destinationName))
    ) {
      ...
    });
  }
}



Bean Validation @GroupSequence Anotasyonu

Örnek Elimizde şöyle bir kod olsun public class SampleRequest {   @NotNull   LocalDate startDate;   @NotNull   LocalDate endDate;   @AssertT...