2009-07-22 11 views
1

Betrachten wir einige Code, der, sagen wir,Wie wiederholbare Unit-Tests von Code, der mit Thread.interrupt funktioniert?

file = new RandomAccessFile(x, "r"); 
file.getChannel().map(....) 

und will ruft einen ClosedByInterruptException Umstand behandeln. Ich bin überrascht, wie man einen realistischen, wiederholbaren Komponententest macht.

Um einen Test zu machen, muss ich irgendwie diesen Thread mit einem anderen Thread synchronisieren und den anderen Thread Thread # Interrupt zur richtigen Zeit aufrufen. Alle Grundelemente zum Warten sind jedoch gut unterbrechbar und löschen den Interrupt.

Für jetzt habe ich Thread.currentThread(). Interrupt in den Code getestet werden (wie durch den Komponententest angefordert), aber das ist nicht wirklich die gleiche Sache wie eine tatsächliche Async-Interrupt, oder?

Antwort

3

Die Sache, die Sie testen möchten, ist die Behandlung der Ausnahme, anstatt die Details der Erstellung. Sie können den relevanten Code in eine andere Methode verschieben und dann diese Methode zum Testen überschreiben und die entsprechende Ausnahme auslösen. Sie können dann die Ergebnisse testen, ohne sich um Threading-Probleme kümmern zu müssen.

Zum Beispiel:

public class Foo { 
    /** 
    * default scope so it is visible to the test 
    */ 
    void doMapping(RandomAccessFile raf) throws ClosedByInterruptException { 
     file.getChannel().map(....); 
    } 

    public void processFile(File x) { 
     RandomAccessFile raf = new RandomAccessFile(x, "r"); 
     doMapping(raf); 
    } 
... 
} 

public class FooTest { 
    @Test 
    void testProcessFile() {  
     Foo foo = new Foo() { 
      @Override 
      void doMapping(RandomAccessFile raf) throws ClosedByInterruptException { 
       throw new ClosedByInterruptException(...); 
      } 
     }; 

     ... 
    } 
}