2016-03-27 17 views
0

Birim testleri için TestNG kullanıyorum ve istisna mesajlarını kontrol etmek istiyorum. Tamam, @Test(expectedExceptionsMessageRegExp = ...) tam ihtiyacım olan şey değil mi? Eh, aynı zamanda mesajlarımı kodlamak için kodlarım karışmamasını istiyorum. Benim istisna kodunu tam olarak karışmaz Bu iki şey hariç mükemmel benim içinTestNG beklenenExceptionsMessageRegExp ve harici iletileri

throw new IllegalArgumentException(MessageFormat.format(
    EXCEPTIONS.getString(EX_NOT_A_VALID_LETTER), c)); 

Works, benziyor bu yüzden gevşek, a guide by Brian Goetz takip ediyorum. Ben burada

@Test(dataProvider = "getInvalidLetters", 
    expectedExceptions = {IllegalArgumentException.class}, 
    expectedExceptionsMessageRegExp = regexize(EXCEPTIONS.getString(EX_NOT_A_VALID_LETTER))) 

yazamıyor, regexize.* ile {0} tarzı yer tutucular yerine gerekiyordu bir fonksiyondur. Ancak, bu “eleman değeri sabit bir ifade olmalıdır” ile başarısız olur. Derleme zamanında gerekli olduğu için mantıklı. Ancak olası geçici çözümler nelerdir?

Bu yapıları gerçek ileti düzenli ifadeleriyle değiştirecek bir test kodu üreteci hayal edebiliyorum, ancak IDE, SCM, derleme araçları vb. Ile tümleştirilmesi bir acı olur.

Başka bir seçenek try-catch kullanmak ve özel durum iletisini el ile denetlemektir. Ama bu çirkin.

Son olarak, gerçekten büyük bir şey olurdu

@Test(expectedExceptionsMessageBundle = "bundle.name.goes.here", 
     expectedExceptionsMessageLocaleProvider = "functionReturningListOfLocales" 
     expectedExceptionsMessageKey = "MESSAGE_KEY_GOES_HERE") 

Bu böyle bir şeyle TestNG kesmek mümkün olmalıdır düşünüyorum. Bunun dışında, Maven'in repodan benim için getirdiği aynı TestNG olmayacaktır. Başka bir seçenek de bunu uygulamak, TestNG'ye bir yama eklenmesi ve serbest bırakılmasını beklemektir. Şimdi bu seçeneği ciddiye alıyorum ama belki daha kolay bir yol var mı? Belli bir şeyi özlemedim mi? Bu konudaki tek kişi ben olamam! Veya iletilerimi yanlış şekilde dışa aktarabilir miyim? Ama Brian Goetz gibi bir adam yanlış olamaz, şimdi yapabilir mi? Ya da I onu yanlış mı anladı?

Güncelleme NetBeans 8.1 kullanarak özellikle

Burada verilen cevap dayanarak, bazı tuzaklar kapsayan a tutorial on the topic yaptık.

cevap

2

Neden bir annotation transformer kullanmıyorsunuz?

Sen böyle bir şey yapmak mümkün olacak: ek açıklama transformatör gibi görünecektir

@LocalizedException(expectedExceptionsMessageBundle = "bundle.name.goes.here", 
     expectedExceptionsMessageLocaleProvider = "functionReturningListOfLocales" 
     expectedExceptionsMessageKey = "MESSAGE_KEY_GOES_HERE") 
@Test(dataProvider = "getInvalidLetters", 
     expectedExceptions = {IllegalArgumentException.class) 
public void test() { 
    // ... 
} 

:

public class LocalizedExceptionTransformer implements IAnnotationTransformer { 
    public void transform(ITest annotation, Class testClass, 
     Constructor testConstructor, Method testMethod) { 
    if (testMethod != null) { 
     LocalizedException le = testMethod.getAnnotation(LocalizedException.class); 
     if (le != null) { 
     String regexp = regexize(le); 
     annotation.setExpectedExceptionsMessageRegExp(regexp); 
     } 
    } 
    } 
} 
+0

ben gibi olamaz dışında ben, gerek tam olarak ne çok görünüyor ek açıklama transformatörlerini örnekte olduğu gibi gerçek ek açıklamalara nasıl döndüreceğinize dair herhangi bir öğretici bulun. Doktorlar, transformatörün bir dinleyici olarak kaydedildiğini söylüyor, ki bu da kabul edilebilir, ancak örneğiniz komut satırı ve dinleyicilerle uğraşmaktan çok daha iyi görünüyor. –

+0

Oh, anladım. Transformatörün aslında * tespit edip mevcut bir notu kullanması anlamına gelir. Fakat bir sınıfın bir ek açıklama olması mümkün mü? Ek açıklamaların arayüz olduğunu düşündüm ... –

+0

'@ LocalizedException' özel bir ek açıklamadır ve' ITest' init zamanında '@ Test'den kopyalanan bilgileri içeren bir TestNG nesnesidir. Sorunuza cevap veriyor mu? – juherr

İlgili konular