2016-06-20 34 views
9

Ho il seguente codice semplice. Ho una classe (TestClass) e voglio testare "someMethod". C'è un metodo statico esterno che è chiamato dal mio "someMethod". Voglio powermock quel metodo statico per restituirmi qualche oggetto fittizio. Ho il @PrepareForTest (ExternalClass.class) all'inizio, ma quando eseguo dà l'errore:Mockito chiede di aggiungere @PrepareForTest per la classe anche dopo aver aggiunto @PrepareForTest

La classe ExternalClass non preparata per il test. Per preparare questa classe, aggiungere la classe all'annotazione '@PrepareForTest'. Nel caso in cui non si usi questa annotazione, aggiungere l'annotazione a livello di classe o metodo.

Ti prego, aiutami a sottolineare ciò che è sbagliato con il modo in cui ho usato @PrepareForTest

@RunWith(PowerMockRunner.class) 
@PrepareForTest(ExternalClass.class) 
public class xyzTest { 
    @Mock 
    private RestTemplate restTemplate; 

    @Mock 
    private TestClass testClass; 

    @BeforeClass 
    private void setUpBeforeClass() { 
     MockitoAnnotations.initMocks(this); 
    } 

    @Test 
    public void testSuccessCase() { 
     Boolean mockResponse = true; 
     ResponseEntity<Boolean> response = new ResponseEntity<Boolean>(mockResponse, HttpStatus.OK); 
     SomeClass someClass = new SomeClass("test", "1.0.0", "someUrl", "someMetaData"); 

     PowerMockito.mockStatic(ExternalClass.class); 

     Mockito.when(restTemplate.postForEntity(any(String.class), any(String.class), eq(Boolean.class))).thenReturn(response); 
     Mockito.when(ExternalClass.getSomeClass(any(String.class))).thenReturn(someClass); 

     Boolean result = testClass.someMethod("test"); 

     Assert.isTrue(result); 
     Mockito.verify(restTemplate, times(1)).postForObject(any(String.class), any(String.class), any()); 
    } 
} 
+0

È Esegui questa classe su JUnit4 in una JVM desktop, giusto? E ExternalClass è _non_ una classe di sistema Java? –

+1

Sì, lo sto eseguendo su JVM desktop (Oracle, 1.8). E ExternalClass è una classe Java personalizzata (NON Java S classe ystem: java *. *) – ViV

+0

Vedo che stai usando 'MockitoAnnotations.initMocks (...)' insieme all'uso di Powermock JUnit Runner. Questo non è necessario. Il corridore Powermock configurerà i tuoi mock. Non so se questo aiuterà la tua situazione, perché sto avendo lo stesso problema e non sto facendo una chiamata aggiuntiva per inizializzare i mock. –

risposta

1

ho avuto lo stesso errore, ma risolto esso. Il mio problema era che ho incluso powermock-module-junit4 ma ho incluso la mia annotazione di prova da TestNG invece di Junit.

5

Assicurati di aggiungere @RunWith(PowerMockRunner.class) all'inizio della classe.

2

Come per l'ultima risposta, il mio problema era anche quello di mescolare l'annotazione di Test da TestNG invece che da Junit Test.

import org.junit.Test; // works 

import org.testng.annotations.Test // did not work 

errore molto astruso e ho trascorso più di 5 ore di debug :(

2

Ho avuto lo stesso errore, risolto questo con l'aggiunta

@Rule 
public PowerMockRule rule = new PowerMockRule(); 

all'interno della classe di test.