4.1 @Devre Dışı

Şimdi JUnit çerçevesinin bazı çok kullanışlı ve popüler ek açıklamalarına bakalım. İlk ek açıklama, JUnit'in onu çağırmaması için belirli bir testi kapatmanıza izin verir. Testin düzgün çalışmadığını fark ettiğinizde veya kodu değiştirdiğinizde testin yanlışlıkla bozulduğu durumlarda gereklidir.

Daha önce yazdığım gibi, testlerin% 99'u kimse tarafından desteklenmiyor, bu nedenle er ya da geç hepsi devre dışı bırakılıyor. Bu nedenle, bu ek açıklama yararlı olanlar listesinde ilk sırada yer almaktadır.

Onun örneğini düşünün:

public class AppTest {

    @Disabled("Test is temporarily disabled. True, true")
    @Test
    void testOnDev(){
        System.setProperty("ENV", "DEV");
        Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
    }

    @Test
    void testOnProd(){
     System.setProperty("ENV", "PROD");
        Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
    }
}

Yukarıdaki örnekte, yöntem testOnDev()çağrılmayacaktır. Bu arada, ek açıklama, @Disabledsınıf bildiriminden hemen önce yazılabilir, ardından tüm yöntemleri göz ardı edilir.

@Disabled("Temporarily turned off the test, we will fix it by May 2001")
public class AppTest {
    @Test
    void testOnDev(){
        System.setProperty("ENV", "DEV");
        Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
    }

    @Test
    void testOnProd(){
     System.setProperty("ENV", "PROD");
        Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
    }
}

4.2 @İç içe

JUnit, iç içe geçmiş sınıflarda test yöntemlerini çağırmanıza izin verir. İç içe test sınıflarını kastediyorum. Bunlarla sık sık karşılaşacağınız bir gerçek değil ama böyle bir olasılık var, bu yüzden ne olduğunu anlamanız gerekiyor.

İç içe geçmiş bir sınıfın yöntemlerini bildiriminden önce çağırmak için bir ek açıklama yazmanız gerekir @Nested. Örnek:

public class AppTest {
    @Nested
    public class DevStagingEnvironment {
    @Test
        void testOnDev(){
            System.setProperty("ENV", "DEV");
            Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
        }
   }

    @Nested
    public class ProductionEnvironment {
        @Test
        void testOnProd(){
           System.setProperty("ENV", "PROD");
           Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
        }
   }
}

Daha fazla ayrıntı resmi belgelerde bulunabilir .

4.3 @ExtendWith

Bir başka yararlı not da @ExtendWith. Muhtemelen onunla çok sık karşılaşacaksınız, o yüzden ona daha detaylı bakalım.

JUnit, çalışmanızın esnek bir şekilde özelleştirilmesi için çeşitli eklentiler (uzantılar) yazmanıza izin veren güçlü bir çerçevedir. Bazı uzantılar testlerle ilgili istatistikleri toplayabilir, diğerleri bir bellek içi dosya sistemini taklit edebilir, diğerleri bir web sunucusunda çalışmayı taklit edebilir vb.

Kodunuz bir çerçeve içinde çalışıyorsa (örneğin, Spring), o zaman neredeyse her zaman bu çerçeve, kodunuzdaki nesnelerin oluşturulmasını ve yapılandırılmasını yönetir . Bu nedenle özel bir test eklentisi olmazsa olmazdır. Örnekler:

Örnek 1. Uzantı, düzgün çalışması için WebServerExtensionçağrılan test yöntemine geçer .URL

@Test
@ExtendWith(WebServerExtension.class)
void getProductList(@WebServerUrl String serverUrl) {
    WebClient webClient = new WebClient();
    // Use WebClient to connect to web server using serverUrl and verify response
    assertEquals(200, webClient.get(serverUrl + "/products").getResponseStatus());
}

Testler genellikle Spring çerçevesiyle çalışan kodu test etmeye şu şekilde başlar:

@ExtendWith(SpringExtension.class)
@ExtendWith(MockitoExtension.class)
class TestServiceTest {

    @MockBean
    TestService service;

    @Test
    void test() {
        assertNotNull(service); // Test succeeds
    }
}

SpringExtensionSpring çerçevesinin test sürümünü oluşturur, ancak MockitoExtentionsahte nesneler oluşturmanıza izin verir. Sahte nesneler çok ilginç bir konu, buna mutlaka değineceğiz ama biraz sonra.

4.4 @Zaman Aşımı

Bu dersi küçük ve ilginç bir notla bitirelim @Timeout. Testi çalıştırmak için zamanı ayarlamanızı sağlar. Test, ek açıklamada belirtilenden daha uzun sürdüyse, başarısız sayılır.

class TimeoutDemo {
    @Test
    @Timeout(value = 100, unit = TimeUnit.MILLISECONDS)
    void failsIfExecutionTimeExceeds100Milliseconds() {
        // test will fail if it takes more than 100 milliseconds
    }
}

Bu dersimizi sonlandırıyor.