2017-05-08 8 views
0

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
+1

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). –

+0

Um folgendes zu tun, muss ich andere Mocks: \t \t Mockito.when (docBuilder.parse (inputSrc)) thenReturn (docMock);. – Tiya

+0

'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 –

Antwort

0

Mit Komponententests können Sie Ihre Komponenten/Klassen testen, nicht die verwendeten Bibliothekskomponenten/Klassen. Ihre Klasse analysiert einen String als XML-Inhalt und um dies zu testen, werden Sie feststellen, dass das Bereitstellen einer Menge von XML-Strings mit bekannter Ausgabe der beste Test ist. Übergeben Sie einfach einen bekannten XML-String an Ihre getestete Klasse und bestätigen Sie, dass das resultierende analysierte Modell die Daten enthält, die Sie für diesen XML-Inhalt erwarten. Ich glaube nicht, dass Sie sich verspotten müssen.