2014-04-29 1 views
15


Stiamo utilizzando EasyMock e PowerMock con JUnit. Lo strumento di copertura utilizzato è ECLEmma. Con EasyMock, mostra la copertura correttamente in verde (come coperto). Tuttavia, per il codice testato con PowerMock, la copertura viene visualizzata in rosso (scoperta). Ho letto domande simili sul web. Tuttavia, volevo solo verificare se esiste una soluzione per questo.PowerMock ECLEmma coverage issue

Grazie
Venkatesh

risposta

8

E 'un problema noto: https://github.com/jayway/powermock/issues/422

Ed è stato per un lungo periodo di tempo, non sarà risolto in qualunque momento presto.

Suggerisco di utilizzare eCobertura invece.

+1

Basta essere consapevoli dei limiti di eCobertura anche prima di cambiare: https://bitbucket.org/jmhofer/ecobertura/issues?status = nuovo e stato = aperto – KrishPrabakar

+0

i plug-in eCobertura sembrano non essere più mantenuti –

+0

Per risolvere il problema, ho finito per suddividere tutti i test che utilizzano un 'PowerMocikito.staticMock' in file di classe separati in modo che il problema di copertura non sia così diffuso a tutti i miei test. – madlymad

7

sì, c'è una soluzione per questo:

In primo luogo si dovrà aggiungere questo Maven dipendenza:

`<dependency> 
    <groupId>org.powermock</groupId> 
    <artifactId>powermock-module-junit4-rule-agent</artifactId> 
    <version>1.6.4</version> 
    <scope>test</scope> 
</dependency>` 

Poi, invece di utilizzare questo @RunWith annotazione (PowerMockRunner.class), solo aggiungere un @Rule nella classe di test in questo modo:

public class Test { 

    @Rule 
    public PowerMockRule rule = new PowerMockRule(); 

si può trovare di più in questo blog Make EclEmma test coverage work with PowerMock

3

Ciò ha funzionato nella maggior parte dei casi nel mio progetto:

@Rule 
public PowerMockRule rule = new PowerMockRule(); 
static { 
    PowerMockAgent.initializeIfNeeded(); 
} 

Rimuovere/Commenta @RunWith(PowerMockRunner.class) & comprendono seguente importazioni dopo l'aggiunta powermock-module-javaagent-1.6.5.jar nel classpath:

import org.junit.Rule; 
import org.powermock.modules.junit4.rule.PowerMockRule; 
import org.powermock.modules.agent.PowerMockAgent; 

Ora click destro-> Copertura As- > Configurazioni di copertura e aggiungi righe seguenti in Argomenti:

-ea -noverify -javaagent:path/to/powermock-module-javaagent-1.6.5.jar 

Fare clic su Applica-> Copertura.

Si noti inoltre che @Before non avrebbe funzionato in questo caso quindi bisogna aggiungere tutte le stoffe nei metodi contrassegnati con @Test dal metodo contrassegnati con @Before.

1

Abbiamo classi statiche da prendere in giro. Con le classi statiche di simulazione, il plugin di copertura del codice di eclEmma non funziona in Eclipse. Quindi, quello che abbiamo fatto è, quindi collocato @RunWith (JUnit4.class) (Invece di @RunWith (PowerMockRunner.class)) prima della lezione e seguenti linee poste classe all'interno

static { 
PowerMockAgent.initializeIfNeeded(); 
} 

@Rule 
public PowerMockRule rule = new PowerMockRule(); 

Compilato la classe e corse la classe di test. La copertura del codice funziona per la classe. Questa modifica è solo in Eclipse IDE.

Dopo aver scritto casi di test, abbiamo ripristinato il codice alla normalità. Collocato @RunWith (PowerMockRunner.class) anziché @RunWith (JUnit4.class) e commentato sopra le righe di codice statico e powermockrule.