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? P>
3 Réponses :
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> puis dans votre classe en utilisant ceci: p> @Test
public void testOperationThatCreatesFile() {
MyClass myClass = new MyClass(mockFileService);
// Do your tests
}
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.
Mocker le constructeur, comme dans ce code exemple. N'oubliez pas strong> de mettre la classe qui sera appelé "nouveau fichier (...)" dans le @preparefortest strong>
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); } }
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.