JUnit ile Spring Data Repository Testi
Öncelikle okumadıysanız eğer önceki yazıları da okumanızda fayda var.
Bu yazıda repository katmanlarımıza nasıl test yazabilirizi incelemeye çalışacağız.
Testlerimiz için H2 veritabanını kullanıyor olacağız. Tabii ki istersek kendi test ortamlarımızı da bağlayabiliriz fakat bu ortamları gereksiz kirletmiş oluruz.
Fakat burada bazı problemlerle karşılaşıyor olabiliriz. Eğer Veritabanına özel fonksiyonlar kullanıyorsanız H2 bunları anlayamacaktır. Yoksa SQL standartına uygun
olduğu sürece sorun yaşamazsınız fakat test ortamınızı da buna göre ayarlarsanız daha sağlıklı bir yaklaşım olacaktır.
1 2 3 4 5 6 7 8 9 10 |
<!-- h2 database --> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> |
Örnek bir repository kodu üzerinden inceleyelim.
Repository
1 2 3 4 5 6 7 8 9 10 |
public interface UserRepository extends JpaRepository<User,Long> { User findByEmail(String email); boolean existsByEmail(String email); } |
Test
@DataJpaTest bize repository katmanlarımızın testini yazmamız için olanak sağlıyor. ApplicationContext’i ayağa kaldırmaz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
@DataJpaTest public class UserRepositoryTest { @Autowired private UserRepository userRepository; private User mockUser; private User prepareUser(String email) { return User.builder() .name("name") .email(email) .password("password") .build(); } @BeforeEach public void setUp() { mockUser = prepareUser("email1"); userRepository.save(mockUser); userRepository.save(prepareUser("email2")); userRepository.save(prepareUser("email3")); } @Test public void it_should_find_by_email(){ User foundUser = userRepository.findByEmail("email1"); assertNotNull(foundUser); assertThat(mockUser.getEmail()).isEqualTo(foundUser.getEmail()); assertThat(mockUser.getName()).isEqualTo(foundUser.getName()); assertThat(mockUser.getPassword()).isEqualTo(foundUser.getPassword()); } } |
@BeforeEach ile her test methodu çalışmadan bir veri seti oluşturduk ve test senaryolarımızı işletmeye çalışıyoruz.
Diğer senaryolarımızı da ekleyelim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
@Test public void it_should_not_find_by_email(){ User foundUser = userRepository.findByEmail("yok@email"); assertNull(foundUser); } @Test public void it_should_return_true_when_user_exists_by_email(){ boolean isExists = userRepository.existsByEmail("email1"); assertTrue(exists); } @Test public void it_should_return_false_when_user_not_exists_by_email(){ boolean isExists = userRepository.existsByEmail("yok@email"); assertFalse(exists); } |
Disable – Enable SQL Query
Default olarak show-sql=true değerine sahip fakat isterseniz aşağıdaki gibi bunu kapatabilirsiniz.
1 2 3 4 5 |
@DataJpaTest(showSql = false) |
Native Query
Native SQL sorguları için aynı yöntemle test yazabilirsiniz. Fakat tekrar hatırlamak gerekirse, veritabanı özelinde kullanılan fonksiyonlarını H2 üzerinde test etmeye çalışırsanız hata alacaktır.
1 2 3 4 5 6 |
@Query(value = "SELECT * FROM USER WHERE isDeleted = true", nativeQuery = true) List<User> findAllByIsDeleted(); |
Kaynak
https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.testing
Faydalı olması dileğiyle.