2016-05-25 21 views
4

In JUnit, mit einem TestWatcher und Überschreiben der failed() Funktion, ist es möglich, die ausgelöste Ausnahme zu entfernen und stattdessen meine eigene Behauptung zu machen?JUnit TestWatcher: fehlgeschlagen, ist es möglich, die ausgelöste Ausnahme zu entfernen (Throwable/stacktrace zu manipulieren)?

Der Anwendungsfall ist: mit Funktionstests auf Android, wenn ein Test, um die App abstürzt macht, würde Ich mag die NoSuchElementException mit einem AssertionError ersetzen („App abgestürzt“).

Ich habe kein Problem die benutzerdefinierte Behauptung zu machen (wenn ich einen Absturz in fertig() Methode erkennen), aber wie die ausgelöste Ausnahme entfernen?

Da in meinem Bericht für einen Test die Ausnahme und die Assertion erstellt, so gibt es mehr Fehler als Test bei Fehler, die Logik ist aber ärgerlich.

Ich frage mich, ob es eine Möglichkeit gab, das Throwable-Objekt anzupassen, um die spezifische NoSuchElementException zu entfernen und den Stacktrace zu manipulieren.

Ich habe es nicht geschafft. (Und unbedingt möchte ich es nicht mit einem Versuch/Fang in jedem Test durchführen ...).

Antwort

3

Sie könnten TestWatcher.apply außer Kraft setzen und eine spezielle catch für NoSuchElementException hinzufügen:

public class MyTestWatcher extends TestWatcher { 
    public Statement apply(final Statement base, final Description description) { 
     return new Statement() { 
      @Override 
      public void evaluate() throws Throwable { 
       List<Throwable> errors = new ArrayList<Throwable>(); 

       startingQuietly(description, errors); 
       try { 
        base.evaluate(); 
        succeededQuietly(description, errors); 
       } 
       catch (NoSuchElementException e) { 
        // ignore this 
       } 
       catch (AssumptionViolatedException e) { 
        errors.add(e); 
        skippedQuietly(e, description, errors); 
       } 
       catch (Throwable e) { 
        errors.add(e); 
        failedQuietly(e, description, errors); 
       } 
       finally { 
        finishedQuietly(description, errors); 
       } 

       MultipleFailureException.assertEmpty(errors); 
      } 
     }; 
    } 
+0

Genau das, was ich wollte, danke :) – Fanch

1

Sie es unter Umgehung tun können. Ein Beispielcode ist unten angegeben. Hoffe es wird dir helfen.

try { 
// Write your code which throws exception 
---- 
---- 
---- 

} catch (NoSuchElementException ex) { 
    ex.printStackTrace(); 
    if (ex instanceof NoSuchElementException) { // bypass 
               // NoSuchElementException 
     // You can again call the method and make a counter for deadlock 
     // situation or implement your own code according to your 
     // situation 
     AssertionError ("app crashed"); 
     if (retry) { 
      --- 
      --- 
      return previousMethod(arg1, arg2,...); 
     } else { 
      throw ex; 
     } 
    } 
} catch (final Exception e) { 
    e.printStackTrace(); 
    throw e; 
} 

Ich habe diese Art von Problem zuvor gelöst. Meine andere Antwort hat Details. Sie können durch meine andere Antwort gehen: android.security.KeyStoreException: Invalid key blob