J'essaie d'écrire des tests d'unité pour une méthode qui prend un nom de fichier chaîne, puis ouvre le fichier et le lit. Donc, pour tester cette méthode, j'ai pensé à écrire un fichier, puis appelant ma méthode. Cependant, dans la ferme de construction, il n'est pas possible d'écrire des fichiers arbitrairement sur le disque. Existe-t-il un moyen standard de "simuler" avoir un fichier réel dans mon test de l'unité? P>
4 Réponses :
Ceci est fortement fronçonné sur: P>
la plus petite quantité de code testable. Souvent une seule méthode / fonction, SANS l'utilisation d'autres méthodes ou classes. Rapide! Des milliers d'unités Les tests peuvent courir en dix secondes ou moins! Un test d'unité n'utilise jamais: p>
- une base de données li>
- Un serveur d'applications (ou serveur de n'importe quel type) LI>
- Système de fichiers / I / O ou de fichiers de fichier; LI>
- une autre application; li>
- la console (système.out, system.err, etc.) li>
- Logging li>
- La plupart des autres classes (les exceptions incluent DTO, String, Entier, Mocks et peut-être quelques autres personnes). " li> ul> blockQuote>
Source P>
Si vous devez lire à partir d'un fichier, un fichier de test a pré-généré que tous les tests d'unités sont allés. Il n'est pas nécessaire d'écrire quoi que ce soit sur le disque. P>
Je ne comprends pas cette réponse - la question concernée teste une méthode qui dépose des E / S. Le test lui-même a été explicitement destiné à ne pas faire de fichier E / S. Ceci est un cas parfaitement acceptable pour un test unitaire.
Que diriez-vous d'utiliser des classes de flux moqueurs, qui remplacent complètement les vrais (comme BufferredReader, Fichier) (signifie toutes les méthodes ou toutes les méthodes que vous utilisez)? Les données peuvent être enregistrées en tant que réseau d'octets, par exemple, dans certains singletons, s'ils doivent être utilisés entre différentes classes de test. P>
Je vais regarder dans ça. Cela me permettrait d'éviter d'aller sur le disque, ce qui rendrait les tests plus rapidement?
J'ai trouvé que Mockito et PowerMock est une bonne combinaison pour cela. En fait, il y a un publication du blog avec un échantillon, où la classe de fichiers est Le constructeur est moqué à des fins de test. Voici aussi un petit exemple que j'ai jeté ensemble: test avec Mockito + PowerMock: P> @RunWith(PowerMockRunner.class)
@PrepareForTest(ClassToTest.class)
public class FileTest
{
@Test
public void testFile() throws Exception
{
//Set up a mocked File-object
File mockedFile = Mockito.mock(File.class);
Mockito.when(mockedFile.exists()).thenReturn(true);
//Trap constructor calls to return the mocked File-object
PowerMockito.whenNew(File.class).withParameterTypes(String.class).withArguments(Matchers.anyString()).thenReturn(mockedFile);
//Do the test
ClassToTest classToTest = new ClassToTest();
classToTest.openFile("testfile.txt");
//Verify that the File was created and the exists-method of the mock was called
PowerMockito.verifyNew(File.class).withArguments("testfile.txt");
Mockito.verify(mockedFile).exists();
}
}
Le poteau de blog lié n'est plus disponible.
Si vous utilisez JUnit, il y a le temporaire a>. Les fichiers sont supprimés après le test. Exemple donné sur la page: [...]
pw = new PrintWriter(folder.getAbsolutePath() + '/' + filename);
pw.println(data);
Nice approche, la chose est que si vous utilisez un fichier physique, votre test devient une intégration une intégration, ce n'est plus un test unitaire plus
Si vous utilisez la capacité de la structure de test de l'unité à fournir des fichiers et des répertoires de test, vous ne savez pas réellement si cela crée un fichier physique - et ne vous souciez pas.
Qu'en est-il d'utiliser le répertoire temporaire? Voir # CreateTempfile
Est la dynamique de fichier? Le nom de fichier est-il dynamique? Qu'est-ce qui est attendu du flux?
CreateTempfile lance SecurityException, juste mon problème ...
Juste un fichier de configuration pour certains objets: je souhaite mettre en place une certaine configuration et la lire la classe, ce n'est pas du tout très dynamique.
Il y a une question connexe / duplication ici: Stackoverflow.com/Questtions/6840303/...