2016-06-20 15 views
9

Ich habe den folgenden einfachen Code. Ich habe eine Klasse (TestClass) und möchte "someMethod" testen. Es gibt eine externe statische Methode, die von meinem "someMethod" aufgerufen wird. Ich möchte PowerStock diese statische Methode, um mir ein Dummy-Objekt zurückzugeben. Ich habe den @ PrepareForTest (ExternalClass.class) am Anfang, aber wenn ich es ausführe, gibt es den Fehler:Mockito fragt, ob @PrepareForTest für die Klasse hinzugefügt werden soll, selbst nachdem @PrepareForTest hinzugefügt wurde

Die Klasse ExternalClass nicht für den Test vorbereitet. Um diese Klasse vorzubereiten, fügen Sie der '@PrepareForTest' Annotation eine Klasse hinzu. Falls Sie diese Annotation nicht verwenden, fügen Sie die Annotation auf Klassen- oder Methodenebene hinzu.

Bitte helfen Sie mir, darauf hinzuweisen, was mit der Art und Weise falsch ich @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

Sie Diese Klasse auf JUnit4 in einer Desktop-JVM ausführen, richtig? Und ExternalClass ist _nicht_ eine Java-Systemklasse? –

+1

Ja, ich verwende es auf Desktop-JVM (Oracle, 1.8) und ExternalClass ist eine benutzerdefinierte Java-Klasse (NICHT Java s ystem-Klasse: d. h. java *. *) – ViV

+0

Ich sehe, Sie verwenden 'MockitoAnnotations.initMocks (...)' zusammen mit dem Powermunk JUnit Runner. Dies ist unnötig. Der Powermock Runner richtet deine Mocks ein. Ich weiß nicht, ob das deiner Situation helfen wird, weil ich das gleiche Problem habe und keinen zusätzlichen Anruf mache, um Mocks zu initialisieren. –

Antwort

1

ich den gleichen Fehler hatte aber beschlossen, es benutzt haben. Mein Problem war, dass ich powermock-module-junit4 einfügte, aber meine Testanmerkung von TestNG anstelle von Junit einschloss.

5

Stellen Sie sicher, dass Sie auch @RunWith(PowerMockRunner.class) an die Spitze Ihrer Klasse hinzufügen.

2

Wie bei der letzten Antwort mischte mein Problem auch die Testannotation von TestNG anstelle von Junit Test.

import org.junit.Test; // works 

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

Sehr abstruse Fehler und ich verbrachte mehr als 5 Stunden Debuggen :(

2

ich den gleichen Fehler hatte, aufgelöst dies durch

@Rule 
public PowerMockRule rule = new PowerMockRule(); 

in der Testklasse hinzufügen.