2014-05-01 16 views
7

Ho una classe che effettua chiamate API native di Windows tramite JNA. Come posso scrivere test JUnit che verranno eseguiti su un computer di sviluppo Windows, ma verranno ignorati su un server di sviluppo Unix?Esegui test di unità solo su Windows

posso facilmente ottenere il sistema operativo host utilizzando System.getProperty("os.name")

posso scrivere blocchi di guardia nel mio test:

@Test public void testSomeWindowsAPICall() throws Exception { 
    if (isWindows()) { 
    // do tests... 
    } 
} 

Questo codice aggiuntivo piastra della caldaia non è l'ideale.

In alternativa ho creato una regola JUnit che gira solo il metodo di prova su Windows:

public class WindowsOnlyRule implements TestRule { 
    @Override 
    public Statement apply(final Statement base, final Description description) { 
     return new Statement() { 
     @Override 
     public void evaluate() throws Throwable { 
      if (isWindows()) { 
      base.evaluate(); 
      } 
     } 
     }; 
    } 

    private boolean isWindows() { 
     return System.getProperty("os.name").startsWith("Windows"); 
    } 
    } 

E questo può essere applicata con l'aggiunta di questo campo annotato alla mia classe di test:

@Rule public WindowsOnlyRule runTestOnlyOnWindows = new WindowsOnlyRule(); 

Entrambi questi meccanismi sono carenti a mio parere in quanto su una macchina Unix passeranno silenziosamente. Sarebbe più bello se potessero essere contrassegnati in qualche modo al momento dell'esecuzione con qualcosa di simile a @Ignore

Qualcuno ha un suggerimento alternativo?

risposta

2

Hai guardato JUnit assumptions?

utile per affermare ipotesi sulle condizioni in cui un test è significativo. Un'ipotesi non riuscita non significa che il codice è rotto, ma che il test non fornisce informazioni utili. Il JUnit corridore di default tratta test con ipotesi di mancanza come ignorato

(che sembra soddisfare i criteri di per ignorare queste prove).

+0

@BrianAgnew utilizzando TestRules è il secondo meccanismo che ho già descritto nella mia domanda. Darò un'occhiata alle ipotesi. – darrenmc

+0

Penso che sia forse più appropriato in questo scenario –

+0

@BrianAgnew Scusa se mi sono un po 'scontroso. Ho solo pensato di averti visto modificare il pezzo di assunzione. – jgitter

0

Presumibilmente non è necessario chiamare in realtà l'API di Windows come parte del test JUnit; ti interessa solo che la classe che è l'obiettivo del test dell'unità chiami ciò che pensa sia l'API di Windows.

Prendere in considerazione l'utilizzo delle chiamate API Windows come parte dei test delle unità.

+0

Sospetto che abbia bisogno di chiamare il codice Windows * in qualche momento * e come tale richiede un test compatibile con Windows. Prendo il tuo punto di vista. beffardo però e sono sicuro che ci sarebbe da usare da qualche parte –

+0

Sì, ho preso in considerazione prendere in giro, ma in questo caso voglio davvero chiamare però al impl implant sottostante – darrenmc