9
votes

Simuler le fichier en Java

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é?


5 commentaires

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/...


4 Réponses :


-2
votes

Ceci est fortement fronçonné sur:

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:

  • une base de données
  • Un serveur d'applications (ou serveur de n'importe quel type)
  • Système de fichiers / I / O ou de fichiers de fichier;
  • une autre application;
  • la console (système.out, system.err, etc.)
  • Logging
  • La plupart des autres classes (les exceptions incluent DTO, String, Entier, Mocks et peut-être quelques autres personnes). "

    Source

    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.


1 commentaires

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.



0
votes

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.


1 commentaires

Je vais regarder dans ça. Cela me permettrait d'éviter d'aller sur le disque, ce qui rendrait les tests plus rapidement?



19
votes

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: xxx pré>

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();
    }
}


1 commentaires

Le poteau de blog lié n'est plus disponible.



2
votes

2 commentaires

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.