TestContainers ile Spring Boot & MongoDB Test İşlemleri
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.
Uygulamayı İndir
Github Adresimden Projeyi İndirebilirsiniz
No Comment! Be the first one.