web-dev-qa-db-fra.com

Powermock (avec Easymock) pas de dernier appel disponible sur maquette

J'essaie simplement de lancer un cas de test simple. J'ai la méthode suivante.

public static void run(String[] args) throws Throwable {
    CommandLineArguments opts = CommandLineOptionProcessor.getOpts(args);
}

Je continuerai à construire cette méthode/cas de test au fur et à mesure. Cependant, je voulais juste m'assurer qu'un cas de test simple fonctionnait en premier. Alors j'ai écrit le test suivant.

@Test
public void testRun() {
    String[] args = {"--arg1", "value", "--arg2", "value2"};

    mockStatic(CommandLineOptionProcessor.class);
    expect(CommandLineOptionProcessor.getOpts(args));

    EasyMock.replay(CommandLineOptionProcessor.class);
}

Après cela, j'obtiens l'erreur suivante:

Java.lang.IllegalStateException: no last call on a mock available

J'ai lu quelques-uns des autres articles sur StackOverflow, mais leur solution semblait être qu'ils utilisaient PowerMock avec Mockito. J'utilise Powermock et Easymock, cela ne devrait donc pas être le problème.

J'ai suivi les conseils de René et ajouté les suivants au sommet de ma classe.

@PrepareForTest(CommandLineOptionProcessor.class)
@RunWith(PowerMockRunner.class)
public class DataAssemblerTest {

J'ai corrigé l'erreur précédente. Mais maintenant j'ai cette erreur.

Java.lang.IllegalArgumentException: Not a mock: Java.lang.Class
at org.easymock.internal.ClassExtensionHelper.getControl(ClassExtensionHelper.Java:61)
at org.easymock.EasyMock.getControl(EasyMock.Java:2172)
at org.easymock.EasyMock.replay(EasyMock.Java:2074)
.
.
.

Toutes les idées sur ce qui pourrait être la cause de ce serait génial.

10
Cameron Jones

Avez-vous annoté la classe de test avec @RunWith(PowerMockRunner.class) et @PrepareForTest(CommandLineOptionProcessor.class)?

 @RunWith(PowerMockRunner.class)
 @PrepareForTest(CommandLineOptionProcessor.class)
 public class TestClass {

     @Test
     public void testRun(){

Vous avez besoin de la @PrepareForTest(CommandLineOptionProcessor.class) au niveau de la classe de test. Voir le doc Powermock :

Utilisez l'annotation @PrepareForTest (ClassThatContainsStaticMethod.class) au niveau de la classe du scénario de test. 

Assurez-vous également que les bibliothèques requises sont sur le chemin de classe de test.

Dans votre cas, la bibliothèque javassist est manquante. Mettez-le sur le classpath. Peut-être qu'il manque d'autres libs ... nous verrons.

Si vous obtenez 

Java.lang.IllegalArgumentException: Not a mock: Java.lang.Class

alors vous utilisez EasyMock.replay(), mais vous devez utiliser PowerMock.replay()

19
René Link
 EasyMock.expectLastCall() 

ou

 EasyMock.expectLastCall().anyTimes() 

ou 

 EasyMock.expectLastCall().andAnswer(..)

n'est pas présent dans votre code, doit être placé après la méthode que vous voulez tester dans le cas où votre méthode de test est une méthode vide.

sinon vous pouvez utiliser:

expect(CommandLineOptionProcessor.getOpts(args)).andReturn(object);

ajoutez aussi ceci à votre classe de test:

  @ObjectFactory
public IObjectFactory getObjectFactory() {

    return new org.powermock.modules.testng.PowerMockObjectFactory( );
}
0
Radu Toader