6.1 iddialar

Onaylar, kodun farklı yerlerine eklenebilen özel kontrollerdir . Görevleri, bir şeylerin ters gittiğini belirlemektir. Daha doğrusu, her şeyin olması gerektiği gibi gidip gitmediğini kontrol etmek için. Bu "gerektiği gibi" ve çeşitli şekillerde ayarlamanıza izin veriyorlar.

Yukarıdaki kodda zaten bazı iddialarla karşılaştınız. İlki, nesneleri eşitlik açısından kontrol etmektir. Nesneler eşit değilse, bir istisna atılır ve test başarısız olur.

Karşılaştırma sırası burada önemlidir , çünkü JUnit nihai raporda "değer 1 alındı, ancak 3 bekleniyordu" gibi bir şey yazacaktır. Böyle bir kontrolün genel formatı şöyledir:

assertEquals(standard , meaning)

Örnek:

@Test
public void whenAssertingEquality () {
    String expected = "3.1415";
    String actual = "3";

    assertEquals(expected, actual);
}

6.2 Yöntemler AssertEquals, AssertTrue, AssertFalse

Aşağıda en popüler yöntemleri - iddiaları listeleyeceğim. İsimlerine göre nasıl çalıştıklarını tahmin etmek oldukça mümkün. Ama yine de kısa bir açıklama yazayım:

iddiaEşittir İki nesnenin eşit olup olmadığını kontrol eder
iddia DizisiEşittir İki dizinin eşit değerler içerip içermediğini kontrol eder
iddiaNotNull Bağımsız değişkenin boş olup olmadığını kontrol eder
iddiaNull Bağımsız değişkenin boş olup olmadığını kontrol eder
iddiaAynı değil İki bağımsız değişkenin aynı nesne olmadığını kontrol edin
iddia aynı İki bağımsız değişkenin aynı nesne olup olmadığını kontrol edin
iddiaTrue Argümanın doğru olup olmadığını kontrol eder
iddiaYanlış Argümanın yanlış olup olmadığını kontrol eder

Bu yöntemlerden bazıları gereksiz görünüyor. AssertTrue(a == b) yazabiliyorken neden iddiaSame(a, b) kullanıyorsunuz ?

Mesele şu ki, iddia çok akıllı bir yöntemdir. Günlüğe hata bilgisi yazmak da dahil olmak üzere pek çok yararlı şey yapar . İlk durumda, A nesnesinin beklendiğini, ancak B nesnesinin alındığını yazacak, ikinci durumda, sadece true beklendiğini yazacaktır .

Özellikle özel bir test sunucusunda çalışan yüzlerce testiniz olduğunda, ayrıntılı günlüklere sahip olmak çok yardımcı olabilir. Ne demek istediğimi anladığınızı düşünüyorum.

Dizi karşılaştırma örneği:

@Test
public void whenAssertingArraysEquality() {
    char[] expected = {'J','u','n','i','t'};
    char[] actual = "Junit".toCharArray();

    assertArrayEquals(expected, actual);
}

6.3 AssertAll yöntemi

Yukarıda bahsedildiği gibi, iddia yöntemi yalnızca bir kontrol gerçekleştirmekle kalmaz, aynı zamanda karşılaştırılabilir nesneler hakkında birçok bilgiyi günlüğe yazar.

Bir karşılaştırma yapalım:

Address address = unitUnderTest.methodUnderTest();
assertEquals("Washington", address.getCity());
assertEquals("Oracle Parkway", address.getStreet());
assertEquals("500", address.getNumber());

Ancak parametrelerden biri eşleşmezse, geri kalanı kontrol edilmeyecektir. Ama yine de olmalarını ve sonuçlarının günlüğe kaydedilmesini istiyorum. Ancak aynı zamanda, en az bir kontrol başarısız olursa, test yine de başarısız oldu.

Bunun için özel bir yöntem var - assertAll() . İlk bağımsız değişken olarak, günlüğe yazılacak bir yorum ve ardından herhangi bir sayıda iddia işlevi gerekir.

Örneğimizin bununla nasıl yeniden yazılacağı aşağıda açıklanmıştır:

Address address = unitUnderTest.methodUnderTest();
assertAll("Complex address comparison script",
    () -> assertEquals("Washington", address.getCity()),
    () -> assertEquals("Oracle Parkway", address.getStreet()),
    () -> assertEquals("500", address.getNumber())
);

Ardından, adres yanlışsa, günlüğe şöyle bir şey yazılacaktır:

	Complex scenario comparison address (3 failures)
	expected: <Washington> but was: <Seattle>
    expected: <Oracle Parkway> but was: <Main Street>
    expected: <500> but was: <5772>

6.4 AssertTimeout yöntemi

@Timeout açıklamasını hatırlıyor musunuz ? Tüm yöntemin yürütme süresini kontrol etmeye izin verdi. Ancak bazen, yöntemin içindeki kodun bir bölümünün yürütülmesine kısıtlamalar koymak yararlı olabilir. Bunun için assertTimeout() kullanabilirsiniz .

İlk parametre olarak zaman, ikinci parametre olarak belirtilen süre içinde çalıştırılması gereken kod (işlev) geçilir. Örnek:

@Test
public void whenAssertingTimeout() {
    assertTimeout(
  	ofSeconds(2),
  	() -> {
    	// pause for one second
    	Thread.sleep(1000);
  	}
	);
}

Assert sınıfı, assertTimeout() yönteminin 12 çeşidine sahiptir . Onlar hakkında daha fazla bilgi edinmek istiyorsanız, resmi belgelere hoş geldiniz .

6.5 AssertThrows yöntemi

Çoğu zaman, belirli bir durumda kodun doğru istisnayı attığından emin olmanız gereken durumlar vardır: bir hata algılar ve doğru istisnayı atar. Bu çok yaygın bir durumdur.

Bu durumda, başka bir yararlı iddia yöntemi vardır - bu, iddiaThrows() yöntemidir . Çağrısının genel formatı şöyledir:

assertThrows(exception , code)

Temel olarak, assertTimeout() yöntemine çok benzer , yalnızca belirtilen kodun doğru istisnayı atıp atmadığını kontrol eder. Örnek:

@Test
void whenAssertingException() {
    Throwable exception = assertThrows(
  	IllegalArgumentException.class,
  	() -> {
      	throw new IllegalArgumentException("Exception message");
  	}
    );
    assertEquals("Exception message", exception.getMessage());
}