0
votes

Ne peut pas que FILEInputStream

J'ai xxx

mon fichierInputStreamfactory: xxx

mon test xxx

Pourquoi mon F est toujours nul? J'ai essayé tous les variations. Mais c'est toujours nul. J'ai créé l'usine pour FileInputStream parce que je ne veux pas utiliser PowerMock pour se moquer de la création sur le nouveau fichierInputtream dans mes tests.


7 commentaires

Essayez quand (fichierInputStreamfactory.getstream ("Mappingfile"))


Désolé, c'était mon erreur quand j'écris la question. J'ai édité ma question


Cependant êtes-vous sûr que vos simulacres sont même injectés? Vous utilisez SpringRunner pour des tests Mockito. Changer @Runwith (SpringRunner.class) à @Runwith (Mockitojunitrunner.class) .


Modifié. Toujours null


Je pense que vous devez ajouter une méthode de configuration avec mockitoannotations.initmocks (this) , afin que vos simulacres se moquent vraiment de vous moquer.


Déjà fait @Before Public Void Configuration () {Mockitoannotations.InitMocks (this); }


Pourquoi ne pas simplement configurer un fichier temporaire?


4 Réponses :


-1
votes

FileInputStream n'a pas de constructeur de no-arg. C'est pourquoi Mockito n'est pas capable d'instancer une simule.

Vous pouvez essayer de faire une espion et de moquer des méthodes nécessaires en conséquence: xxx

edit :

Vous pouvez également créer votre simule dans une méthode de test de cette façon: xxx


6 commentaires

Mais je ne peux pas l'écrire parce que cela dit que l'exception non gérée Filenotfound


essayez l'alternative


Je vois que cette usine est créée mais comme toujours, sa juste f = null. Même avec alternative. Thx quand même pour votre suggestion.


Essayez de créer un espion réel dans la classe de test à l'aide de Mockito.spy


Même problème avec yamlfactory.getyaml (). Mais yaml getyaml () {retour New Yaml () n'a pas de constructeur argileux


@Maciejkowalski: La moqueur de FileInputStream est créée correctement, même s'il n'y a que des arguments du constructeur présent, voir l'exemple de ma réponse.



0
votes

1) Essayez Code ci-dessous:

        @Test
        public void itShouldReturnFileInputStream() {
            FileInputStreamFactory mockFileInputStreamFactory = mock(FileInputStreamFactory.class);
            FileInputStream  mockFileInputStream = mock(FileInputStream.class);
            Mockito.doReturn(mockFileInputStream).when(mockFileInputStreamFactory).getStream("fileName");
            CodesConverterService  codeConverterService = new CodesConverterService(mockFileInputStreamFactory);
            assertThatCode(() -> codeConverterService.codeConverterService()).doesNotThrowAnyException();
        }


1 commentaires

FileInputStreamfactory a un constructeur par défaut par défaut puisqu'il n'a pas déclaré d'autres constructeurs ...



2
votes

J'ai reproduit votre test dans l'exemple suivant, cela fonctionne pour moi.
(Vérifié avec Junit 4 code> & Mockito code> 3.0.0 code> et 2.28.2 code>)

la seule chose que je Changé était le coureur code>, mais selon vos commentaires, vous l'aviez déjà fait. P>

J'ai supprimé les annotations dans l'exemple car elles devraient être sans importance lorsque le test est exécuté avec le test MockitojuniRunner Code> et modifié le type de retour de loadmappingsfromsource code> Pour ajouter facilement ce Assert.Assertainotnull code>. J'ai également remplacé la codesconverterException code> avec un RunTimeException code>. P>

Aucune de ces modifications ne doit affecter le test lui-même. P>

Mock code> pour FileInputStream code> est créé correctement, même s'il n'y a que le constructeur avec des arguments présents. P>

@RunWith(MockitoJUnitRunner.class)
public class CodesConverterServiceTest {

    class YamlFactory {
    }

    class FileInputStreamFactory {
        public FileInputStream getStream(final String file) throws FileNotFoundException {
            return new FileInputStream(file);
        }
    }

    static class CodesConverterService {    

        private final FileInputStreamFactory fileInputStreamFactory;

        public CodesConverterService(FileInputStreamFactory fileInputStreamFactory, YamlFactory yamlFactory) {
            this.fileInputStreamFactory = fileInputStreamFactory;
        }

        public FileInputStream loadMappingsFromSource() {
            try {
                return fileInputStreamFactory.getStream("mappingFile");
            } catch (Exception e) {
                throw new RuntimeException("Can`t load mappings from source");
            }
        }
    }

    @InjectMocks
    private CodesConverterService codesConverterService;

    @Mock
    private FileInputStreamFactory fileInputStreamFactory;

    @Mock
    private FileInputStream fileInputStream;

    @Test
    public void whenLoadMappingsFromSource_GoodPath() throws FileNotFoundException {

        Mockito.when(fileInputStreamFactory.getStream("mappingFile")).thenReturn(fileInputStream);
        Assert.assertNotNull(codesConverterService.loadMappingsFromSource());
    }
}


0 commentaires

0
votes

Je pense que j'étais mon erreur que j'utilisais @Runwith (springrunner.class) et mokitoannotations.initmocks (this); simultanément. Et si vous utilisez les deux - alors mokcks a créé mais ne fonctionne pas correctement. Donc je viens de supprimer mockitoannotations.initmocks (this);


0 commentaires