Arşivler

TestContainers ile Spring Boot & MongoDB Test İşlemleri

TestContainers Nedir Spring Boot MongoDB Uygulama Örneği
TestContainers Nedir Spring Boot MongoDB Uygulama Örneği

Spring Boot Dersleri‘ne devam ediyorum. Spring Boot Projelerini Testcontainers araciligi ile test nasil yapilir bir Spring Boot, Postgres ornegi yaparak aciklayacagim.

TestContainer Nedir?

TestContainers uygulamalarimizi test edebilmemiz icin gerekli ortami docker araciligi ile olusturup, testlerimizi izole sekilde yapmamizi saglamaktadir. Testlerin ihtiyaç duyduğu altyapıyı bize saglar ve bunu Docker kullanarak gerceklestirir.

Spring Boot Mongo DB Ornegi

Basit bir Student spring boot projesi yapacagiz. Bir rest api olacak ve Crud islemleri yapilacak. Kullanacagimiz bagimliliklar su sekilde.

 implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
 implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
 implementation 'org.springframework.boot:spring-boot-starter-web'
 testImplementation 'org.springframework.boot:spring-boot-starter-test'
Code language: YAML (yaml)

TestContainer Kutuphanesi

Test islemleri icin ayrica spring boot icin testcontainer kutuphanesini ve veritabani olarak kullanacagimiz ve test ortaminda da kullanacagimiz testcontainer mongodb bagimliligini ekleyelim.

testImplementation 'org.springframework.boot:spring-boot-testcontainers'
testImplementation 'org.testcontainers:junit-jupiter'
testImplementation 'org.testcontainers:mongodb'
Code language: YAML (yaml)

Uygulama

Entity, Repository, Servis ve Controller katmanlarımızı yazalım.

@Document
public class Student {
  @Id
  String id;
  String name;
  Integer age;
}
Code language: Java (java)
@Repository
public interface StudentRepository extends MongoRepository<Student, Long> {
}
Code language: Java (java)
@Repository
public interface StudentRepository extends MongoRepository<Student, Long> {
}
Code language: Java (java)
@Service
public class StudentService {

  private final StudentRepository repository;

  public StudentService(StudentRepository repository) {
    this.repository = repository;
  }

  public Student saveStudent(Student student) {
    return this.repository.save(student);
  }
}
Code language: Java (java)
@RestController
public class StudentController {

  private final StudentService service;

  @PostMapping
  public Student createTodo(@RequestBody Student student) {
    return this.service.saveStudent(student);
  }
}
Code language: Java (java)

Test & TestContainers

Uygulamamızın testini yazarken TestContainers’den faydalanacağız. Bu nedenle MongoDb’yi Docker sayesinde test süreci boyunca ayağa kalkacak ve test işlemlerini gerçekleştirecek.

Şimdi konfigürasyonumuzu hazırlayalım.

@Configuration
@EnableMongoRepositories
public class MongoDBTestContainerConfig {
  
  @Container
  @ServiceConnection
  public static MongoDBContainer mongoDBContainer = new MongoDBContainer("mongo:latest");

  static {
    mongoDBContainer.start();
    var mappedPort = mongoDBContainer.getMappedPort(27017);
    System.setProperty("mongodb.container.port", String.valueOf(mappedPort));
  }
}
Code language: Java (java)

Bir container ayağa kaldımak için mongonun hangi sürümü olacağını belirterek @Container anotasyonu ile tanımlamamızı yaptıktan sonra getMappedPort ile çalışacağı portu belirliyoruz.

Test kalsörümüzdeki application.properties dosyasına propertylerimizi yazalım.

spring.data.mongodb.database=testdb
spring.data.mongodb.port=${mongodb.container.port}
spring.data.mongodb.host=localhost

Bu işlemin ardından testimizi yazmaya hazırız. Test sınıfımızı oluşturalım.

@DataMongoTest
@Testcontainers
@ContextConfiguration(classes = MongoDBTestContainerConfig.class)
public class StudentRepositoryIntegrationTest {
 
  @Autowired
  private StudentRepository studentRepository;

  @Test
  public void testStudentSave() {
    Student student = new Student();
    student.setName("Burak");
    student.setAge(20);
    Student savedStudent = studentRepository.save(student);
    Assertions.assertNotNull(savedStudent.getId());
    Assertions.assertEquals(student.getName(), savedStudent.getName());
    Assertions.assertEquals(student.getAge(), savedStudent.getAge());
  }
}
Code language: Java (java)

Burada gerekli anotasyonlarımızı sınfımıza koyduktan sonra bildiğimiz klasik testimizi rahatça yapabiliriz.

Testi çalıştırdığımızda öncesinde mongo docker ayağa kalkıyor ve sonrasında uygulamadaki testlerimiz koşmaya başlıyor.

Spring Boot Testcontainers Nedir
Spring Boot Testcontainers Nedir

Uygulamayı İndir

Github Adresimden Projeyi İndirebilirsiniz



Önceki Ders: Spring Boot @ConditionalOnExpression Nedir?
Spring Boot Dersleri
Sonraki Ders: HTTP Service Client- Spring Boot 4.0