AssertJ assertThat'a özel bir mesaj ekleyebilir misiniz?


93

Öncelikle JUnit iddialarını Hamcrest eşleştiricilerle kullanan bir test paketimiz var. Ekibimizden biri AssertJ ile deneyler yapmaya başladı ve söz dizimi, esnekliği ve bildirimselliği ile insanları etkiledi. JUnit'in AssertJ'de eşdeğerini bulamadığım bir özelliği var: özel bir assert hatası mesajı eklemek.

Genellikle insan tarafından okunabilir olmayan ve rastgele görünen kimlikleri veya UUID'leri olan nesneleri karşılaştırıyoruz ve içerdikleri verilerden ne olmaları gerektiğini söylemek imkansız. Bu, kod tabanımız için kaçınılmaz bir durumdur, ne yazık ki, yerine getirdiği amacın bir parçası olarak, diğer hizmetler arasında verilerin ne olduğunu anlamadan haritalandırılmasıdır.

JUnit'te assertThatyöntem String reason, Matcher<T>paramdan önce bir parametreye sahip bir sürüm sağlar . Bu, karşılaştırmanın bir insan için ne ifade etmesi gerektiği gibi, soruna biraz ışık tutacak kısa bir hata ayıklama dizisi eklemeyi önemsiz hale getirir.

Öte yandan AssertJ, Assert arabiriminin bir biçimini veya birçok uygulama sınıfından birini döndüren jilyon farklı jenerikleştirilmişstatic assertThat yöntem sağlar . Bu arabirim, hatalara dahil edilecek özel bir mesaj ayarlamanın standart bir yolunu sağlamaz.

Mesaj eklemek istediğimiz her assert türü için özel bir assert sınıfı oluşturmak zorunda kalmadan bu işlevi AssertJ API'sinden veya uzantılarından birinden almanın bir yolu var mı ?

Yanıtlar:


139

Ve klasik tarzda, soruyu gönderdikten birkaç dakika sonra aradığımı buldum. Umarım bu, bir sonraki kişinin ne dendiğini bilmek zorunda kalmadan bulmasını kolaylaştırır. Sihirli yöntemi kısa adlı aldatıcı olduğunu asbaşka bir arayüz bunun bir parçası olan AbstractAssert: uygular Descriptable değil taban belirt arayüzü.

public S as(String description, Object... args)

String.format(String, Object...)Sözdizimini destekleyen bu nesnenin açıklamasını ayarlar .
Misal :

try {
  // set a bad age to Mr Frodo which is really 33 years old.
  frodo.setAge(50);
  // you can specify a test description with as() method or describedAs(), it supports String format args
  assertThat(frodo.getAge()).as("check %s's age", frodo.getName()).isEqualTo(33);
} catch (AssertionError e) {
  assertThat(e).hasMessage("[check Frodo's age] expected:<[33]> but was:<[50]>");
}

hasMessageOnaylama işlemi başarısız olursa , catch bloğundaki alıntılanan dizge birim test çıktı günlüğünüzde görünen şeydir.


Bunu , soruda bağlantısı failWithMessageverilen özel iddia sayfasındaki yardımcıyı fark ederek buldum . Bu yöntem için JavaDoc , korumalı olduğuna işaret eder, bu nedenle arayanlar tarafından özel bir mesaj ayarlamak için kullanılamaz. Ancak asyardımcıdan bahsediyor :

Ayrıca, bu yöntem ile as(String, Object...)kullanıcı tarafından tanımlanan veya geçersiz kılınan hata mesajıyla ayarlanan herhangi bir açıklama geçerlidir overridingErrorMessage(String, Object...).

... ve standart AssertJ mesajını sağlanan yeni dizeyle tamamen değiştiren overridingErrorMessage yardımcısı expected: ... but was:....

AssertJ ana sayfası, Soft Assertions bölümündeki asyardımcının örneklerini gösteren , ancak ne yaptığını doğrudan açıklamayan özellikler vurgulanana kadar her iki yardımcıdan da bahsetmez .


25

Patrick M'nin cevabına başka bir seçenek eklemek için:

Kullanmak yerine Descriptable.asşunları da kullanabilirsiniz AbstractAssert.withFailMessage():

try {
  // set a bad age to Mr Frodo which is really 33 years old.
  frodo.setAge(50);
  // you can specify a test description via withFailMessage(), supports String format args
  assertThat(frodo.getAge()).
    withFailMessage("Frodo's age is wrong: %s years, difference %s years",
      frodo.getAge(), frodo.getAge()-33).
    isEqualTo(33);
} catch (AssertionError e) {
  assertThat(e).hasMessage("Frodo's age is wrong: 50 years, difference 17 years");
}

Kullanmanın farkı Descriptable.as, size özel mesaj üzerinde tam kontrol sağlamasıdır - "beklenen" ve "oldu" yoktur.

Bu, test edilen gerçek değerlerin sunum için yararlı olmadığı durumlarda kullanışlıdır - bu yöntem, başka, muhtemelen hesaplanmış değerleri göstermenize veya hiç göstermenize izin vermez.


Aynı şekilde, herhangi bir gerçek iddiadan önceDescriptable.as aramanız gerektiğini unutmayın - aksi takdirde, iddia withFailMessage() önce harekete geçeceği için işe yaramaz. Bu, Javadoc'ta belirtilmiştir.


4
"Herhangi bir gerçek iddiadan önceFailMessage () ile aramalısınız" teşekkürler, bu beni şaşırttı . withFailMessageMaddeyi çağırma sırası ; AssertJ'yi seviyorum ama bu berbat.
Abhijit Sarkar


0

as()AssertJ'de dahili yöntemi kullanın . Örneğin:

 assertThat(myTest).as("The test microservice is not active").isEqualTo("active");
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.