2016-03-27 5 views
0

Ich verwende TestNG für meine Komponententests und möchte Ausnahmemeldungen überprüfen. OK, @Test(expectedExceptionsMessageRegExp = ...) ist genau das, was ich brauche, oder? Nun, zur gleichen Zeit möchte ich meine Nachrichten externalisieren, damit sie nicht mit meinem Code vermischt werden. Ich folge lose a guide by Brian Goetz, so mein Ausnahmecode wieTestNG expectedExceptionsMessageRegExp und externalisierte Nachrichten

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

funktioniert perfekt für mich sieht, mit Ausnahme dieser beiden Dinge nicht genau mischen. Ich kann

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

hier nicht schreiben, ist regexize eine Funktion, die angeblich {0} -Stil Platzhalter mit .* zu ersetzen. Dies schlägt jedoch mit einem "Elementwert muss ein konstanter Ausdruck sein" fehl. Sinnvoll, da es zur Kompilierzeit benötigt wird. Aber was sind mögliche Problemumgehungen?

Ich kann mir einen Testcode-Generator vorstellen, der diese Konstrukte durch echte Nachrichtenregexps ersetzen würde, aber es wäre ein Schmerz, sie in IDE, SCM, Build-Tools usw. zu integrieren.

Eine andere Option ist try-catch zu verwenden und Ausnahmebedingungsnachricht manuell zu überprüfen. Aber das ist hässlich.

Schließlich denke ich, es sollte möglich sein TestNG mit so etwas wie

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

Dies wäre eine große Sache, wirklich zu hacken. Nur dass es nicht das gleiche TestNG ist, das Maven für mich aus dem Repo holt. Eine andere Möglichkeit besteht darin, dies zu implementieren, einen Patch zu TestNG beizutragen und darauf zu warten, dass er freigegeben wird. Ich denke jetzt ernsthaft über diese Option nach, aber vielleicht gibt es einen einfacheren Weg? Habe ich nicht etwas Offensichtliches verpasst? Ich kann unmöglich der einzige mit diesem Problem sein!

Oder vielleicht exportiere ich meine Nachrichten falsch. Aber ein Typ wie Brian Goetz kann sich nicht irren, oder? Oder habe ich I falsch verstanden?

aktualisieren

Basierend auf der Antwort hier gegeben, ich habe a tutorial on the topic gemacht, vor allem einige Fallen abdeckt, wenn NetBeans 8.1 verwenden.

Antwort

2

Warum nicht mit annotation transformer hier?

können Sie wie etwas tun:

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

Wo die Anmerkung Transformator aussehen wird:

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

sehr Sieht genau das, was ich brauche, außer, dass ich nicht scheinen, Finden Sie ein Tutorial, wie Sie Annotationstransformatoren in echte Annotationen umwandeln können, wie in Ihrem Beispiel. Die Dokumentation sagt, dass Sie den Transformer als Listener registrieren, was auch akzeptabel ist, aber Ihr Beispiel sieht viel besser aus, als mit Command Line und Listeners zu spielen. –

+0

Oh, hab es. Sie wollen Transformator dazu bringen, * tatsächlich * zu erkennen und eine vorhandene Anmerkung zu verwenden. Aber ist es möglich, dass eine Klasse eine Anmerkung ist? Ich dachte, Annotationen wären Interfaces ... –

+0

'LocalizedException' ist eine benutzerdefinierte Annotation und' ITest' ist ein TestNG-Objekt, das Informationen enthält, die beim Initialisieren von '@Test' kopiert wurden. Beantwortet es deine Frage? – juherr