9
votes

Est-il possible d'utiliser PowerMock pour simuler une nouvelle création de fichiers?

Je veux couvrir une logique, qui crée des fichiers avec des tests unitaires. Est-il possible de se moquer de la classe de fichiers et d'éviter la création de fichiers réelle?


2 commentaires

C'est une bonne question. Ne mérite pas d'être évité.


Avez-vous essayé d'utiliser PowerMock? PowerMock se moque de nouvelles créations d'objets à l'intérieur de la méthode afin de travailler.


3 Réponses :


6
votes

Je ne suis pas sûr que si c'est possible, mais j'ai eu une telle exigence, et je l'ai résolu en créant une interface code> westerservice code>. Donc, au lieu de créer directement / accéder aux fichiers, vous ajoutez une abstraction. Ensuite, vous pouvez facilement vous moquer de cette interface dans vos tests.

Par exemple: p> xxx pré>

puis dans votre classe en utilisant ceci: p>

@Test
public void testOperationThatCreatesFile() {
    MyClass myClass = new MyClass(mockFileService);
    // Do your tests
}


5 commentaires

Correct. Lorsque vous ne pouvez pas vous moquer, enveloppez-le dans une abstraction (interface), puis moquez-le.


Mais alors vous modifiez le code réel pour aider les tests, il est bon et possible d'éviter cela avec EasyMock / Powermock


@CarloshenriquerOdriguez Oui, vous êtes. Et c'est une bonne chose. Le code d'écriture testable (souvent) réduit le couplage dans votre code. Vous devriez considérer que le code de test fait partie de votre architecture.


Mais même un code lâchement couplé aura besoin de quelque chose de plus puissant que cela. Si vous devez tester le comportement FileServiceImpl, par exemple, vous devrez vous moquer du constructeur de fichiers de toute façon.


Bien sûr, je vois ton point et je généralisais. Cependant, à ce niveau, je envisagerais de le vérifier avec un test d'intégration à la place, comme je le ferais pour une classe qui effectue des opérations de base de données. Après tout, la création et / ou la vérification d'un fichier sont assez simples, même sans se moquer.



8
votes

Mocker le constructeur, comme dans ce code exemple. N'oubliez pas de mettre la classe qui sera appelé "nouveau fichier (...)" dans le @preparefortest xxx


0 commentaires

6
votes

Essayez PowerMockito

import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;


@PrepareForTest(YourUtilityClassWhereFileIsCreated.class)
public class TestClass {

 @Test
 public void myTestMethod() {
   File myFile = PowerMockito.mock(File.class);
   PowerMockito.whenNew(File.class).withAnyArguments().thenReturn(myFile);
   Mockito.when(myFile.createNewFile()).thenReturn(true);
 }

}


0 commentaires