J'ai mon fichierInputStreamfactory: p> mon test p> 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. P> P>
4 Réponses :
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: p> edit Strong>: P> Vous pouvez également créer votre simule dans une méthode de test de cette façon: p>
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.
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(); }
FileInputStreamfactory code> a un constructeur par défaut par défaut puisqu'il n'a pas déclaré d'autres constructeurs ...
J'ai reproduit votre test dans l'exemple suivant, cela fonctionne pour moi. la seule chose que je Changé était le coureur 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 Aucune de ces modifications ne doit affecter le test lui-même. P>
(Vérifié avec Junit 4 code> &
Mockito code>
3.0.0 code> et
2.28.2 code>)
code>, mais selon vos commentaires, vous l'aviez déjà fait. P>
loadmappingsfromsource code> Pour ajouter facilement ce
Assert.Assertainotnull code>.
J'ai également remplacé la
codesconverterException code> avec un
RunTimeException code>. 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());
}
}
Je pense que j'étais mon erreur que j'utilisais @Runwith (springrunner.class) code> et
mokitoannotations.initmocks (this); code> 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); code> p>
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) Code> à
@Runwith (Mockitojunitrunner.class) code>.
Modifié. Toujours null
Je pense que vous devez ajouter une méthode de configuration avec
mockitoannotations.initmocks (this) code>, 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?