6
votes

Maquette statique ne fonctionne pas

J'ai le test d'unité d'échantillonnage suivant qui tente de simuler java.nio.file.files, mais cette simulation ne fonctionne pas et le code tente de supprimer le chemin d'échantillon.

[...]
if (e == null) {
            Files.delete(dir);
            return FileVisitResult.CONTINUE;
        }
[...]


1 commentaires

BTW Je reçois une nosuchfileException.


3 Réponses :


4
votes

Avez-vous ajouté

import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest(Files.class)
public class TestVisitor {
  public class PrintingVisitor extends SimpleFileVisitor<Path> {
    @Override
    public FileVisitResult postVisitDirectory(final Path dir, final IOException exc) throws IOException {
      Files.delete(dir);
      return FileVisitResult.CONTINUE;
    }
  }

  @Test
  public void testPostVisitDirectory() throws Exception {
    final Path mockedPath = Paths.get("sample path");

    /* Mocking */
    PowerMockito.mockStatic(Files.class);
    PowerMockito.doNothing().when(Files.class, PowerMockito.method(Files.class, "delete", Path.class));
    /* End Mocking */

    final PrintingVisitor visitor = new PrintingVisitor();
    Assert.assertEquals("The was a problem visiting the file", FileVisitResult.CONTINUE, visitor.postVisitDirectory(mockedPath, null));
  }
}


8 commentaires

Oui c'est présent. Dans la même classe, j'ai en fait avoir un talon PowerMockito.stub (Powermockito.Method (Files.class, "DeleteIfexists", path.class)) .Toreturn (vrai); qui fonctionne


Mais puisque la suppression renvoie, je ne peux pas utiliser la même technique :(


Mon problème pourrait être plus compliqué que moi. J'ai couru avec succès votre extrait dans une classe séparée, mais cela ne fonctionne pas dans ma classe actuelle. Peut se moquer des choses en désordre au niveau de la classe d'essai?


Je ne suis pas sûr de ce que tu veux dire. La moqueur ne doit pas affecter la manière dont la classe de test (en supposant que ceci est celle contenant les fonctions @Test méthodes), bien que le @Runwith fait évidemment.


Il semble que le @preparefortest ne se comporte pas correctement, il y a des personnes qui ont des problèmes similaires groups.google.com/forum/?fromgroups = #! Sujet / Powermock / ...


Dans votre extrait si vous supprimez PowerMockito.Donothing (). Le test passe toujours à cause du moquystique de sorte que je devine que la méthode moquystique échoue


Le comportement par défaut de mocktstatic () est de faire des méthodes de vide ne rien faire. C'est probablement une bonne forme pour inclure explicitement le donothing () cependant, pour préciser ce que vous avez l'intention d'arriver à quelles méthodes particulières.


Le lien semble utiliser PowerMock avec EasyMock. Je me demande comment applicable c'est? Avez-vous vérifié toutes vos importations pour vous assurer que c'est la même classe Classe de votre visiteur et de votre cas de test?



1
votes

J'ai eu un problème similaire et il s'avère qu'il était lié à la préparation des bonnes classes.

Dans l'exemple ci-dessus, la classe testée était déjà dans la «PRÉPARACE PLADRE», car il s'agissait d'une classe interne de la classe de test.

Vous devez ajouter les classes à @preparfortest qui appelez les méthodes statiques ... et dans mon cas, ils n'étaient pas suffisants car le code qui a accédé à des fichiers (code> était à l'intérieur d'une classe anonyme qui ne peut pas être explicitement préparée.

J'ai nommé la classe anonyme et l'a ajouté à @preparfortest et tout a fonctionné


1 commentaires

J'ai essayé d'ajouter la classe à @preparfortest, puis de courir dans une erreur de pileMap, en raison d'un bogue dans le dernier Javassist: questions.jboss.org/browse/jassist-205 :-(. Rendu à nouveau sur la moqueur de la classe de fichiers mais merci pour la pointe!



5
votes

J'ai eu un problème similaire à l'aide de PowerMock 1.5.1 et de la classe de fichiers et suspecte qu'il a un problème statique moqueur de certaines classes JDK1.7, bien que je ne sache pas pourquoi. J'ai également vérifié la version javassiste et au moment où il était le plus récent (3.18.0-GA),

J'ai dépouillé ma classe sous test de la ligne de fichiers et elle n'a toujours pas fonctionné. J'ai ensuite décidé d'essayer de se moquer d'une autre classe statique, stringutils.chop ("string"); (Commons-Lang3), puis mon test PowerMock a fonctionné et j'ai pu forcer à générer une exception de simulacre.

Cela m'a prouvé que j'avais tout fait par le livre et que je me suis moqueur statique. 'T Travailler sur les classes de fichiers mais il a fait sur Stringutils.

Ainsi, j'ai changé, les appels @preparesportest et les appels PowerMockito.MockStatic () pour référencer la classe correcte.

à la fin, j'ai abandonné des fichiers moqueurs. Juste une tête en tête au cas où quelqu'un d'autre a le même problème.

éditer. Vous avez travaillé: J'ai depuis essayé de nouveau que j'en avais besoin dans un autre projet. Il existe une nouvelle version de PowerMock Out (1.5.3) qui utilise un javassist mis à jour (3.18.1-GA) qui corrige un bogue que j'ai mentionné dans ma réponse à un autre commentaire.

Je peux systématiquement se moquer de la moqueur de fichiers pour fonctionner en ajoutant la classe sous test sur @preparfortest ainsi que des fichiers Même si la classe que vous testez n'expose pas statique méthodes. Je n'avais pas eu besoin de faire cela avant pour d'autres moqueurs statiques. Je ne sais pas pourquoi il est nécessaire ou fonctionne différemment pour fichiers .

exemple: xxx

et le test ci-dessous: xxx


3 commentaires

Bravo pour cela. Je devais ajouter le "MyTestClass.class" à @preparefortest aussi pour obtenir des fichiers et des chemins se moque de travailler


Lorsque vous appliquez @preparfortest à une classe, il gâche la couverture Jacoco bien sûr. Parce que les deux instrument la classe.


J'utilise d'essayer de se moquer de la classe de fichiers (fichiers, obtenir ()). Mais la moqueur ne fonctionne pas et je reçois une exception Nullpointer. Une idée de ce que pourrait être le problème?