2016-09-16 2 views
0

Zu Testzwecken möchte ich manchmal sehen, wie mein Code mit einer unerwarteten Laufzeitausnahme aus verschiedenen Teilen des Codes behandelt wird.Java: Kann ich zur Laufzeit eine Laufzeitausnahme in eine beliebige Klassenmethode injizieren?

Zum Beispiel sagen, ich habe eine Methode, wie so:

public int getSum(int x, int y) 
{ 
    return x + y; 
} 

Gibt es eine Möglichkeit für mich, diese Methode zu veranlassen, zum Scheitern verurteilt, wenn es durch Auslösen einer Ausnahme statt der Rückkehr ein gültiges Ergebnis genannt wird? Ich weiß, dass ich dazu expliziten Code hinzufügen könnte, aber ich würde gerne wissen, ob es möglich ist, eine Methode in irgendeiner Klasse durch eine neue Methode zu ersetzen, die nur eine Ausnahme zur Laufzeit auslöst, oder so ähnlich ;-) Art wie how Mockito can do the following:

doThrow(new Exception()).when(mockedObject).methodReturningVoid(...); 

ich würde keine Lösungen vorziehen, keine zusätzlichen Werkzeuge erforderlich - nur den Standard-JVM. Vielen Dank!

+0

Warum möchten Sie dies während der Laufzeit? –

+2

Denken Sie daran, dass Laufzeitausnahmen im Allgemeinen dazu dienen, Fehler in Ihrer Software zu melden, z. B. dass Nullen nicht ordnungsgemäß behandelt werden. Es gibt nichts in einer Methode wie dieser, die jemals erwartet werden sollte, eine Ausnahme zu werfen, und ich kann mir keinen guten Grund vorstellen, es zu simulieren. – chrylis

+0

@TimBiegeleisen - Meine Absicht ist es, Teile unseres Codes auf unerwartete Weise zum Scheitern zu bringen. Ein bisschen wie ein [Chaos Affe] (http://whatis.techtarget.com/definition/Chaos-Monkey). Ich kann nicht willkürlich anfangen, Code hinzuzufügen, um zufällige Ausnahmen zu Schlüsselteilen unseres Codes zu werfen, weil ich nicht alles davon besitze - ich bin nur auf einem Team .... und andere Teams besitzen Hauptabschnitte. Aber wenn ich ihren Code fälschlicherweise zur Laufzeit fälschen kann, aus meiner eigenen Codebasis, dann kann ich Fehlerszenarien testen, an die sie vielleicht nicht gedacht haben. Und ich bekomme, dass dies wahrscheinlich in Unit-Tests gemacht werden könnte, aber es könnte hier einen Vorzug geben –

Antwort

0

Für einen einfachen Zweck könnten Sie versuchen, Invocation Handler zu verwenden: Klassenmethodenaufrufe umleiten und Ausnahme auslösen, falls erforderlich.

Für anspruchsvollere Manipulationen können Sie Java Instrumentation API verwenden.

Verwandte Themen