2 Mart 2020 Pazartesi

SpringBoot Test @TestConfiguration Anotasyonu - Test İçin Gerekli Beanler Yaratılır

Giriş
Şu satırı dahil ederiz.
import org.springframework.boot.test.context.TestConfiguration;
Bu sınıf 
- Hem tek başına test için kullanılabilir. 
- Hem de @SpringBoot ile birlikte Integration Test için kullanılabilir.

Yani bu anotasyona sahip sınıf içinde test için gerekli beanler yaratılır.

Her iki kullanımda da bir ApplicationContext yaratılır. 

Tek Başına Test İçin Kullanım
Tek başına kullanımı eski Spring ile gelen @ContexConfiguration ile aynı. Yani @TestConfiguration içinde tanımlı olmayan bir bean test ile aynı src paketinde olsa bile yüklenmez ve testte kullanılamaz.

Örnek
Şöyle yaparız
@ExtendWith(SpringExtension.class)
public class EmployeeServiceImplTest {
 
  @TestConfiguration
  static class EmployeeServiceImplTestContextConfiguration {
 
    @Bean
    public EmployeeService employeeService() {
      return new EmployeeServiceImpl();
    }
  }
 
  @Autowired
  private EmployeeService employeeService;
 
  @MockBean
  private EmployeeRepository employeeRepository;
 
  // write test cases here
}
@SpringBoot İle Integration Test İçin Kullanım
- Tüm uygulamadaki bean'lere ilave olarak bazı bean'leri daha ayağa kaldırmak isteyelim. SpringBootTest olarak işaretli sınıfın içinde static bir sınıf yaratılır ve bu sınıf @TestConfiguration olarak işaretlenir.
- Uygulamadaki bir bean'i override etmek isteyelim. Yine @TestConfiguration ile bunu yapabiliriz.


Bu anotasyonu kullanmak için iki yol var
1. Sınıfın testten farklı bir sınıfta tanımlı olması ve @Import ile teste dahil edilmesi
2. Sınıfın static bir inner class olması

Örnek
Genel kullanım için şöyle yaparız.
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@RunWith(SpringRunner.class)
public class IntegrationTests {

  // test methods
  ...
  // test configuration
  @TestConfiguration
  static class TestSecurityConfig {...}

}
Örnek
Şöyle yaparız. Burada test için TestRestTemplate sınıfının bazı özellikleri atanıyor.
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
class SampleWebClientTests {

  @Autowired
  private TestRestTemplate template;

  @Test
  void testRequest() {
    HttpHeaders headers = this.template.getForEntity("/example", String.class)
.getHeaders();
    assertThat(headers.getLocation()).hasHost("other.example.com");
  }

  @TestConfiguration(proxyBeanMethods = false)
  static class Config {

    @Bean
    RestTemplateBuilder restTemplateBuilder() {
      return new RestTemplateBuilder().setConnectTimeout(Duration.ofSeconds(1))
        .setReadTimeout(Duration.ofSeconds(1));
    }
  }
}

Hiç yorum yok:

Yorum Gönder