2009-07-22 3 views
1

Tenir compte du code qui appelle, par exemple,Comment faire des tests unitaires répétables de code qui fonctionne avec Thread.interrupt?

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

et veut gérer une circonstance ClosedByInterruptException. Je suis perplexe sur la façon de faire un test unitaire réaliste et reproductible.

Pour faire un test, j'ai besoin de synchroniser ce thread avec un autre thread, et provoquer l'autre thread à appeler l'interruption Thread # au bon moment. Cependant, toutes les primitives d'attente sont, bien, interruptibles, et effacent l'interruption. Pour l'instant j'ai Thread.currentThread(). Interruption dans le code testé (comme demandé par le test unitaire), mais ce n'est pas vraiment la même chose qu'une véritable interruption asynchrone, n'est-ce pas?

Répondre

3

La chose qui vous intéresse dans le test est la gestion de l'exception, plutôt que les détails de sa création. Vous pouvez déplacer le code approprié dans une autre méthode, puis remplacer cette méthode pour le test et lancer l'exception correspondante. Vous êtes alors en mesure de tester les résultats sans vous soucier des problèmes de threading.

Par exemple:

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(...); 
      } 
     }; 

     ... 
    } 
} 
Questions connexes