Yanıtlar:
Yararlı bulduğum bazı durumlar:
try{ // do stuff... fail("Exception not thrown"); }catch(Exception e){ assertTrue(e.hasSomeFlag()); }
Not:
JUnit4'ten bu yana, bir istisna atıldığını test etmenin daha zarif bir yolu var: @Test(expected=IndexOutOfBoundsException.class)
Ancak, istisnayı da incelemek istiyorsanız bu işe yaramaz, o zaman yine de ihtiyacınız vardır fail()
.
Bence olağan kullanım durumu, olumsuz bir testte hiçbir istisna atılmadığında çağırmaktır.
Aşağıdaki sözde kod gibi bir şey:
test_addNilThrowsNullPointerException()
{
try {
foo.add(NIL); // we expect a NullPointerException here
fail("No NullPointerException"); // cause the test to fail if we reach this
} catch (NullNullPointerException e) {
// OK got the expected exception
}
}
@Before yöntemimde bir şeylerin ters gitmesi durumunda kullandım.
public Object obj;
@Before
public void setUp() {
// Do some set up
obj = new Object();
}
@Test
public void testObjectManipulation() {
if(obj == null) {
fail("obj should not be null");
}
// Do some other valuable testing
}
@Before
yöntemin başarılı olduğundan emin olmak istiyorsanız , muhtemelen bu yöntemde doğrudan kontrol etmek daha iyidir. Bonus olarak, en azından JUnit ve TestNG, @Before
/ @After
methodlardan gelen hatalar için farklı bir başarısızlık bile rapor edecek , böylece sorunun testin kendisinde olmadığını görebilir.
Başarısız yöntemini böyle kullanıyorum.
Test durumunuzun sonuçlanabileceği üç eyalet vardır
amaçlanan (Bir istisna olmasını bekleyen negatif test durumlarının aksine).
Tutulma kullanıyorsanız, sırasıyla Yeşil, Mavi ve kırmızı işaretçilerle gösterilen üç durum vardır.
Üçüncü senaryo için başarısız işlemi kullanıyorum.
ör: public Tamsayı toplama (tamsayı a, Tamsayı b) {yeni Tamsayı döndür (a.intValue () + b.intValue ())}
fail()
.
Örneğin, fail()
henüz bitmemiş testleri belirtmek için kullanıyorum (oluyor); aksi takdirde başarılı görünürlerdi.
Bu belki de NUnit'te var olan bir çeşit tamamlanmamış () işlevselliğin farkında olmamamdan kaynaklanıyor olabilir.
Eşzamanlı ve / veya asenkron ayarlarında, vardır (siz söyleyin, örneğin delegeler, olay dinleyicileri, tepki işleyicileri) arasında söz konusu yöntemler doğrulamak isteyebilirsiniz değil denir. Alaycı çerçeveler bir yana, fail()
testlerde başarısız olmak için bu yöntemleri çağırabilirsiniz . Süresi dolan zaman aşımları, bu tür senaryolarda başka bir doğal arıza durumudur.
Örneğin:
final CountDownLatch latch = new CountDownLatch(1);
service.asyncCall(someParameter, new ResponseHandler<SomeType>() {
@Override
public void onSuccess(SomeType result) {
assertNotNull(result);
// Further test assertions on the result
latch.countDown();
}
@Override
public void onError(Exception e) {
fail(exception.getMessage());
latch.countDown();
}
});
if ( !latch.await(5, TimeUnit.SECONDS) ) {
fail("No response after 5s");
}
En önemli kullanım durumu muhtemelen istisna kontrolüdür.
Junit4, bir istisna olup olmadığını kontrol etmek için beklenen öğeyi içerirken, yeni junit5'in bir parçası değilmiş gibi görünüyor. Kullanmanın bir diğer avantajı fail()
üzerine expected
Bunu, birleştirmek olmasıdır finally
test case temizleme sağlanır.
dao.insert(obj);
try {
dao.insert(obj);
fail("No DuplicateKeyException thrown.");
} catch (DuplicateKeyException e) {
assertEquals("Error code doesn't match", 123, e.getErrorCode());
} finally {
//cleanup
dao.delete(obj);
}
Başka bir yorumda belirtildiği gibi. Uygulamayı bitirene kadar başarısız olacak bir teste sahip olmak da mantıklı geliyor.