• Cts. Eyl 18th, 2021

Spring Boot İle Unit Test Yazalım

Merhabalar.

Bu yazıda sizlere bir Spring Boot projesinde nasıl unit test yazabileceğimizden bahsedeceğim.

Daha önceleri size bahsettiğim bir projem olan MemberRestAPIProject projesi üzerinden bu yazımı örnekleyeceğim. MemberRestAPIPRoject içerisinde kullanıcı ekleme servisi eğer sistemde ekleme işi için gelen e-posta adresi ile kayıtlı bir kullanıcı var ise sistem bu işlemi reddeder. Biz test işleminde kayıtlı olduğunu bildiğimiz bir e-posta adresi ile kayıt işlemi deneyeceğiz.

pom.xml’e Eklenecek Bağımlılık

pom.xml dosyamıza sadece spring-boot-starter-test bağımlılığımızı eklemek yeterlidir. Bu bağımlılık test işlemi için kullanacağımız JUnit ve Mockito kütüphanelerini projemize ekleyecek.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
</dependency>

Test Kodumuz

@RunWith(MockitoJUnitRunner.class)
public class MemberSaveServiceTest {

    @Mock
    MemberRepository memberRepository;

    @Mock
    ResourceBundleMessageManager resourceBundleMessageManager;

    @Mock
    MemberUtil memberUtil;

    @InjectMocks
    MemberSaveService memberSaveService;

    @Test
    public void testSavingWithExistingEmail() {
        Member member = new Member();
        member.setPassword("TEST1234");
        member.setEmail("ilkgunel93@gmail.com");
        List<Member> memberList = new ArrayList<>();
        memberList.add(member);
        when(memberRepository.findByEmail("ilkgunel93@gmail.com")).thenReturn(Optional.of(member));
        try {
            memberSaveService.addAdminMember(memberList);
        } catch (CustomException exception) {
            assertEquals(ErrorCodes.ERROR_06.getErrorCode(), exception.getErrorCode());
        } catch (MessagingException messaginException) {
            //Ignore it
        }
    }
}

Test kodumuz içerisinde yapılan işlemlere adım adım bakalım:

  • Test sınıfımızı @RunWith notasyonu ile işaretliyoruz ve notasyona MockitoJUnitRunner sınıfını parametre olarak geçiyoruz. Bu işlem sınıfımızın bir Mockito test sınıfı olarak örneklenmesini ve çalıştırılmasını sağlayacak.
  • Test edeceğimiz işlem MemberSaveService sınıfı içerisinde yer aldığı için MemberSaveService sınıfının ihtiyaç duyduğu bazı objeleri test sınıfı içerisinde @Mock notasyonu ile mock’luyoruz. Testin çalıştırılması sırasında bu objeler Mockito tarafından oluşturulacak.
  • @InjectMocks notasyonu ile de @Mock notasyonu ile işaretlediğimiz objelerin enjekte edilmesi işlemini sağlıyoruz. Bu notasyon ile MemberSaveService sınıfı ihtiyaç duyduğu objelere sahip olmuş olacak.
  • @Test notasyonu ile işaretli metodumuz JUnit’den gelen bildiğimiz test metodumuz.
  • testSavingWithExistingEmail metodumuz içerisinde bir member objesi oluşturup parola ve email alanlarını dolduruyoruz. Akabinde bir memberList listesi oluşturup oluşturduğumuz member objesini bu listeye ekliyoruz.
  • Mockito’dan gelen when metodu çağırımı ile şu metot çağırıldığında şöyle sonuç versin diye metodu simüle edebiliyoruz. when(memberRepository.findByEmail(“ilkgunel93@gmail.com”)).thenReturn(Optional.of(member)) dediğimiz zaman memberRepository içerisindeki findByEmail metodu ilkgunel93@gmail.com parametresi ile çağırıldığı zaman bize Optional tipinde olacak şekilde az önce oluşturduğumuz member objesi dönülecek.
  • try bloğunun içerisinde bir liste kabul eden addAdminMember metodunu memberSaveService objesi üzerinden çağırıyoruz. addAdminMember metodu kendi akışı içerisinde kayıtlı e-posta adresi olup olmadığını memberRepository üzerinden kontrol ediyor. Bu noktada da simüle ettiğimiz değer bize dönecek ve sistemde bu e-posta adresi ile kayıtlı kullanıcı varmış gibi davranacak.
  • Veri tabanında var olan e-posta adresi ile kayıt talebi geldiğinde sistem ERROR-06 kodu ile bir CustomException fırlatıyor. Burada catch bloğu içinde de bu hata yakalanıp gelen hata kodunun beklediğimiz hata kodu olup olmadığına assertEquals metodu ile bakıyoruz.

SONUÇ

Bu yazı ile birlikte Spring Boot projesinde nasıl Unit Test yazılabileceğine dair bilgi edinmiş olduk. Başka yazıda görüşene kadar sağlıacakla olun.

2016 İstanbul Üniversitesi Bilgisayar Mühendisliği mezunuyum. Güncel olarak Paycore'da SoftPOS projesinde Java Developer olarak çalışmaktayım. Büyük oranda Java teknolojileri ile uğraşıp kendimi geliştirmeye çalışıyorum.

İlkay Günel

2016 İstanbul Üniversitesi Bilgisayar Mühendisliği mezunuyum. Güncel olarak Paycore'da SoftPOS projesinde Java Developer olarak çalışmaktayım. Büyük oranda Java teknolojileri ile uğraşıp kendimi geliştirmeye çalışıyorum.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir