Ich habe eine Klasse-under-Test, der den folgenden Code hat:Mockito mit newInstance Methode
public void getDetails (String message){
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
StringReader strReader = new StringReader(message);
InputSource inputSrc = new InputSource(strReader);
Document doc = docBuilder.parse(inputSrc);
...
}
Ich möchte mit Mockito einen JUnit für dieses Stück Code schreiben. Ich habe versucht, verschiedene Dinge wie:
DocumentBuilderFactory docBuilderFactoryMock = Mockito.mock(DocumentBuilderFactory.class);
Mockito.when(DocumentBuilderFactory.newInstance()).thenReturn(docBuilderFactoryMock);
Aber ich bekomme die Ausnahme:
org.mockito.exceptions.misusing.WrongTypeOfReturnValue:
DocumentBuilderFactory$$EnhancerByMockitoWithCGLIB$$23223735 cannot be returned by toString()
toString() should return String
If you're unsure why you're getting above error read on.
Due to the nature of the syntax above problem might occur because:
1. This exception *might* occur in wrongly written multi-threaded tests.
Please refer to Mockito FAQ on limitations of concurrency testing.
2. A spy is stubbed using when(spy.foo()).then() syntax. It is safer to stub spies -
- with doReturn|Throw() family of methods. More in javadocs for Mockito.spy() method.
Wenn ich folgendes:
DocumentBuilderFactory docBuilderFactoryMock = Mockito.spy(DocumentBuilderFactory.newInstance());
DocumentBuilder documentBuilderMock = Mockito.mock(DocumentBuilder.class);
Mockito.when(docBuilderFactory.newDocumentBuilder()).thenReturn(documentBuilderMock);
docBuilderdocBuilderMockito.when(docBuilderFactoryMock.newDocumentBuilder()).thenReturn(docBuilderFactoryMock);
und Debug meinen Code dann sehe ich, dass die Klasse -under-test verwendet meine Mock-Objekte nirgendwo, sondern erstellt eigene Objekte und löst eine SAXParseException unter
012 aus
Mockito kann statische Methoden nicht vortäuschen. Warum willst du diese Klassen und Methoden trotzdem vortäuschen? Es sollte Ihnen egal sein, wie das Dokument erstellt wird. Entscheidend ist, dass es richtig ist, basierend auf der Eingabezeichenfolge (oder dass die Methode mit dem Dokument korrekt ist, aber Sie den wichtigen Teil weggelassen haben). –
Um folgendes zu tun, muss ich andere Mocks: \t \t Mockito.when (docBuilder.parse (inputSrc)) thenReturn (docMock);. – Tiya
'DocumentBuilderFactory.newInstance()' ist eine statische Methode. Und um eine statische Methode zu verspotten, müssen Sie powermock verwenden: https://github.com/powermock/powerermock/wiki/MockStatic –