20 Ekim 2020 Salı

SpringBoot Test @SpringBootTest Anotasyonu classes Alanı

Giriş 
Bu alan en önemli ve kullanımı karışık alan bu yüzden ayrı bir yazıya taşımak istedim. Açıklaması şöyle
The component classes to use for loading an ApplicationContext. Can also be specified using @ContextConfiguration(classes=...). If no explicit classes are defined the test will look for nested @Configuration classes, before falling back to a @SpringBootConfiguration search.
1. Bu Alan Tanımlı Değilse

1.1 Bu Anotasyonla Beraber @ContextConfiguration Varsa
O zaman sanki bu alana değer tanımlanmış gibi @ContextConfiguration ile tanımlı bean'leri yükler.  
@ContextConfiguration SpringBoot gelmeden önceki standart spring test anotasyonudur. 

Örnek
Hem bu alana değer atamazsak ve tek bir bean ile ApplicationContext yaratmak istersek şöyle yaparız.
@RunWith(SpringRunner.class)
@SpringBootTest(properties = "spring.profiles.active=test")
@ContextConfiguration(classes = MyTestBean.class)
1.2 Test Sınıfı İçinde @Configuration Anotasyonu Varsa
@Configuration ile tanımlı bean'leri yükler
Örnek
Tüm uygulama yerine sadece belli bean'leri ayağa kaldırmak isteyelim. Test içinde @Configuration olarak işaretli static sınıf yaratırız. Şöyle yaparız.
@RunWith(SpringRunner.class)
@SpringBootTest
public class SomeTest {

    @Configuration
    static class ContextConfiguration {
        @Bean
        @Primary //may omit this if this is the only SomeBean defined/visible
        public SomeBean someBean () {
            return new SomeBean();
        }
    }

    @Autowired
    private SomeBean someBean;

    @Test
    public void testMethod() {
        // test
    }
}
1.3 Test Sınıfı İçinde @TestConfiguration Anotasyonu Varsa
Örnek
Tüm uygulamadaki bean'lere ilave olarak bazı bean'leri daha ayağa kaldırmak isteyelim. Test içinde @TestConfiguration olarak işaretli bir static sınıf yaratırız.

1.4 Test Sınıfı İçinde @Configuration Anotasyonu Yoksa
@SpringBootConfiguration anotasyonlu sınıfı arar ve onu yükler. Bu sınıf ta tüm Spring uygulamasıdır
Örnek
@SpringBootApplication olarak işaretli sınıfın paket olarak test sınıfının paketinde olması gerekir. Eğer @SpringBootApplication olarak işaretli sınıf bulunamazsa şu hatayı alırız.
Unable to find a @SpringBootConfiguration, you need to use 
@ContextConfiguration or @SpringBootTest(classes=...) ...

2. Bu Alan Tanımlıysa

2.1 Sadece Belirtilen Sınıfları Yükler
Yüklenen sınıf yine @SpringBootApplication uygulaması olabilir

Örnek
Tüm uygulama yerine sadece belli bean'leri ayağa kaldırmak isteyelim. Elimizde şöyle bir kod olsun.
@Configuration
public class ApplicationConfig {

  @Bean
  public MapperFactory mapperFactory() {
    return new DefaultMapperFactory.Builder().build();
  }
}
Şöyle yaparız.
@SpringBootTest(classes = ApplicationConfig.class)
@RunWith(SpringRunner.class)
@AutoConfigureMockMvc
public class ProductSupplierIntegrationTests {
  // tests
}
Örnek
Test sınıfımızın paketi şöyle olsun com.example.test.JpaTest
@SpringBoot olarak işaretli sınıfı com.example paketinde arar. Eğer  sınıfımız com.example.Application ise sorun yoktur. Ancak sınıfımız com.example.application.Application ise hata alırız. Bu durumda en doğrusu @SpringBoot olarak işaretli sınıfı açıkça belirtmek. Şöyle yaparız
@SpringBootTest(classes = Application.class)
Örnek
Yine aynı şekilde farklı bir paketteki tüm uygulamayı ayağa kaldırmak isteyelim. Elimizde şöyle bir kod olsun.
@SpringBootApplication
public class Application {

  public static void main(String[] args) throws Exception {
    SpringApplication.run(Application.class, args);
  }
}
Şöyle yaparız.
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class ApplicationTest{

  @Autowire
  Foo foo //whatever you are testing

  @Test
  public void FooTest() throws Exception{
    Foo f = foo.getFooById("22");
    assertEquals("9B". f.getCode); 
  }
}

Hiç yorum yok:

Yorum Gönder