2016-07-08 20 views
6

Nella consueta beffarda con @Mock e @InjectMocks annotazioni, la classe in fase di test dovrebbe essere eseguito con @RunWith(MockitoJUnitRunner.class).@RunWith (PowerMockRunner.class) vs @RunWith (MockitoJUnitRunner.class)

@RunWith(MockitoJUnitRunner.class) 
public class ReportServiceImplTestMockito { 

    @Mock 
    private TaskService  mockTaskService; 

    @InjectMocks 
    private ReportServiceImpl service; 

     // Some tests 
} 

ma in qualche esempio io sto vedendo @RunWith(PowerMockRunner.class) in uso:

@RunWith(PowerMockRunner.class) 
public class Tests { 
    @Mock 
    private ISomething mockedSomething; 

    @Test 
    public void test1() { 
    // Is the value of mockedSomething here 
    } 

    @Test 
    public void test2() { 
    // Is a new value of mockedSomething here 
    } 
} 

qualcuno potrebbe farlo notare che cosa è la differenza e quando voglio usare uno piuttosto che un altro?

risposta

12

A prima vista, la risposta è semplice: beh, ci sono diverse strutture di derisione là fuori.

Ma la brutta verità è: il PowerMock è fondamentalmente un grido di aiuto. Dice "la classe sotto test è cattiva, per favore aggiustala".

Seriamente; PowerMock permette di testare il codice che non può essere testato con altri framework di scherno: ci vogliono le vostre classi di produzione (in modo che il codice di byte proveniente dalla sorgente) e manipola quelli al fine di consentire beffardo statici metodi o finale classi/metodi. Potrebbe non sembrare troppo male, ma credimi: lo è.

Prima di tutto, significa che PowerMock non prova tuoi classi, ma le classi che PowerMock manipolato. Quindi: (più o meno completamente) uccide la tua capacità di eseguire strumenti di copertura.

E la cosa peggiore di tutte: essere preparati per bizzarri fallimenti, che non capisci, che puoi eseguire il debugging per ore, per non trovare mai niente di sbagliato nel tuo codice. Soprattutto quando si sta già lavorando con altri framework che eseguono la manipolazione del codice byte.

Quindi, in sostanza: a volte, un progetto è stato implementato in modo da rendere impossibile il test. Quindi alcune persone decidono di utilizzare PowerMock per superare questi problemi e continuare a consentire il test.

Ma ai miei occhi: non dovresti passare a PowerMock, invece devi cambiare il tuo progetto e correggere i problemi che ti fanno chiedere PowerMock.

L'unico motivo accettabile per utilizzare PowerMock è quando si desidera testare il codice esistente (forse di terze parti) che non è assolutamente possibile modificare.

+1

Che succede a questa crociata personale contro PowerMock !? Ora, capisco che * è * una libreria di derisione con determinati problemi, ma è stata creata (non da me, BTW - ne ho creata un'altra) nel tentativo di risolvere problemi reali che alla fine emergono quando si scrivono test sul mondo reale. Solo per darti una situazione perfettamente legittima del mondo reale in cui tale strumento è utile: prendere in giro il metodo statico 'FacesContext.getCurrentInstance()' in modo da poter verificare le chiamate previste con il metodo 'addMessage (...)'. Inoltre, altre affermazioni fatte qui sono di fatto sbagliate o molto discutibili. –

+0

In base alla mia esperienza, i framework Power * Mocking non sono solo * un * framework di un insieme di framework equivalenti. Ai miei occhi, questo prodotto è più simile a quel tipo di medicina, che dovrebbe essere consumato solo in casi molto rari; e dopo un sacco di "briefing" da parte del medico. La cosa è: ho passato troppe ore cercando di risolvere i problemi relativi a PowerMocking; o ascoltando persone che hanno visto quei bizzarri problemi che occasionalmente incontri. E, cosa più importante: nel 95% dei casi, è stato semplicemente che le persone hanno creato un design cattivo e non verificabile. E invece di cambiarlo, si sono rivolti a PowerMock. – GhostCat

+0

Sono d'accordo; gli sviluppatori non dovrebbero rivolgersi a una libreria di derisione per evitare di risolvere problemi di testabilità. Questo è vero tanto quanto la situazione in cui evitano il buon design OO o API per aggirare i limiti di una libreria di derisione. Per me, la migliore risposta a entrambe queste situazioni è di evitare del tutto di deridere, e andare per un test di * integrazione *; è quello che faccio io stesso. –

0

PowerMock consente di simulare metodi statici e privati, nonché classi finali e altro ancora.

PowerMock è un framework che estende altre librerie di finte come EasyMock con funzionalità più potenti. PowerMock utilizza un manipolatore di classe personalizzato e manipolazione del codice per abilitare il mocking di metodi statici , costruttori, classi e metodi finali, metodi privati, rimozione di inizializzatori statici e altro.

Ci può essere qualche codice odore se avete bisogno di prendere in giro quei tipi di componenti, ma può essere utile.Ad un certo punto potresti lavorare in un progetto obsoleto che ha creato classi di helper statiche con dipendenze che devono essere prese in giro. Se hai la possibilità di cambiare l'architettura, allora correggi il tuo design! Altrimenti, utilizza la tecnologia giusta per i tuoi test.

Se non è necessario simulare funzioni statiche o private di quelle che non è necessario utilizzare PowerMock. PowerMock è un involucro attorno ad altri framework di derisione.

Problemi correlati