2016-06-20 19 views
9

Mam następujący prosty kod. Mam klasę (TestClass) i chcę przetestować "someMethod". Istnieje zewnętrzna metoda statyczna, która jest wywoływana przez mój "someMethod". Chcę Powermock tej statycznej metody, aby zwrócić mi jakiś obojętny obiekt. Mam @PrepareForTest (ExternalClass.class) na początku, ale po uruchomieniu daje błąd:Mockito prosi o dodanie @PrepareForTest dla klasy nawet po dodaniu @PrepareForTest

Klasa ExternalClass nie przygotowany do testu. Aby przygotować tę klasę, dodaj klasę do adnotacji '@PrepareForTest'. Jeśli nie używasz tej adnotacji, dodaj adnotację na poziomie klasy lub metody.

Proszę mi pomóc wskazać, co jest nie tak ze sposobem Użyłem @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

Ty uruchamiasz tę klasę na JUnit4 w wirtualnej maszynie JVM, prawda? I ExternalClass nie jest klasą systemu Java? –

+1

Tak, używam go na JVM na komputer (Oracle, 1.8), a ExternalClass to niestandardowa klasa Java (NIE JAVA s Klasa ystem: np. java *. *) – ViV

+0

Widzę, że używasz 'MockitoAnnotations.initMocks (...)' wraz z używaniem Powermock JUnit Runner. To nie jest konieczne. Biegacz Powermock skonfiguruje Twoje drwiny. Nie wiem, czy to pomoże twojej sytuacji, ponieważ mam ten sam problem i nie robię dodatkowego połączenia, żeby zainicjować mocks. –

Odpowiedz

1

Miałem ten sam błąd, ale rozwiązać go. Mój problem polegał na tym, że zawierałem powermock-module-junit4, ale zawierałem moją adnotację testową z TestNG zamiast z Junit.

5

Upewnij się, że dodajesz również @RunWith(PowerMockRunner.class) do najwyższej klasy.

2

Podobnie jak w przypadku ostatniej odpowiedzi, moim problemem było także mieszanie adnotacji testowej z TestNG zamiast testu Junit.

import org.junit.Test; // works 

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

błąd bardzo zawiłe i spędziłem więcej niż 5 godzin debugowania :(

2

Miałem ten sam błąd, to rozwiązane poprzez dodanie

@Rule 
public PowerMockRule rule = new PowerMockRule(); 

wewnątrz klasy testowej.