web-dev-qa-db-fra.com

Mockito demande d'ajouter @PrepareForTest pour la classe même après avoir ajouté @PrepareForTest

J'ai le code simple suivant. J'ai une classe (TestClass) et je veux tester "someMethod". Il existe une méthode statique externe appelée par mon "méthode". Je veux Powermock cette méthode statique pour me retourner un objet factice . J'ai le @PrepareForTest (ExternalClass.class) au début, mais quand je l'exécute, il donne l'erreur:

La classe ExternalClass non préparée pour le test . Pour préparer cette classe, ajoutez une classe à l'annotation '@PrepareForTest' . Si vous n'utilisez pas cette annotation, ajoutez-la au niveau classe ou méthode.

S'il vous plaît, aidez-moi à indiquer ce qui ne va pas avec la façon dont j'ai utilisé @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());
    }
}
14
ViV

Assurez-vous d’ajouter @RunWith(PowerMockRunner.class) au sommet de votre classe.

11
wild_nothing

J'ai eu la même erreur, résolu en ajoutant 

@Rule
public PowerMockRule rule = new PowerMockRule();

à l'intérieur de la classe de test.

5
Felicia Agatha

Comme pour la dernière réponse, mon problème consistait également à mélanger l'annotation Test de TestNG au lieu de Junit Test.

import org.junit.Test; // works

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

Erreur très abstruse et j'ai passé plus de 5 heures à déboguer :(

4
user2121316

Pour ceux qui essaient de faire fonctionner cela avec Junit 5, si vous utilisez la version bêta de powermock-module-junit4 qui est compatible avec 4+, la bibliothèque ne reconnaîtra toujours pas

import org.junit.jupiter.api.Test;

et il jettera un:

org.powermock.api.mockito.ClassNotPreparedException

lorsque @PrepareForTest est appliqué à la classe que vous voulez simuler statique. Si vous souhaitez utiliser PowerMock, vous devrez revenir à Junit 4 ou créer un MockWrapper pour votre méthode statique à ce stade. 

PowerMock 2.0: Github Roadmap

2
Aaron Tobias

J'ai eu la même erreur mais l'ai résolue. Mon problème était que j'avais inclus powermock-module-junit4 mais inclus mon annotation test de TestNG au lieu de Junit. 

1
Dan

Si les réponses ci-dessus ne fonctionnent pas, essayez extends PowerMockTestCase. Cette astuce a fonctionné pour moi.

Exemple: public class xyzTest extends PowerMockTestCase

0
Akshay Thorve

J'ai eu la même erreur. J'utilisais TestNG pour exécuter les tests. J'ai dû utiliser la méthode suivante pour résoudre le problème ci-dessus.

@ObjectFactory
    public IObjectFactory getObjectFactory() {
        return new PowerMockObjectFactory();
    }
0
Will_Panda