2017-05-08 1 views
0

J'ai une classe sous test qui a le code suivant:Mockito avec la méthode newInstance

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

Je veux écrire un JUnit pour ce morceau de code à l'aide Mockito. J'ai essayé différentes choses comme:

DocumentBuilderFactory docBuilderFactoryMock = Mockito.mock(DocumentBuilderFactory.class);  
Mockito.when(DocumentBuilderFactory.newInstance()).thenReturn(docBuilderFactoryMock); 

Mais je reçois l'exception:

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. 

Si je fais ce qui suit:

DocumentBuilderFactory docBuilderFactoryMock = Mockito.spy(DocumentBuilderFactory.newInstance()); 
DocumentBuilder documentBuilderMock = Mockito.mock(DocumentBuilder.class); 
Mockito.when(docBuilderFactory.newDocumentBuilder()).thenReturn(documentBuilderMock); 
docBuilderdocBuilderMockito.when(docBuilderFactoryMock.newDocumentBuilder()).thenReturn(docBuilderFactoryMock); 

et déboguer mon code alors je vois que la classe -under-test n'utilise pas mes objets Mock n'importe où mais crée ses propres objets et lève une exception SAXParseException à

Document doc = docBuilder.parse(inputSrc); 
+1

Pourquoi voulez-vous se moquer de ces classes et méthodes de toute façon? Vous ne devriez pas se soucier comment le document est créé. Ce qui importe est que c'est correct, basé sur la chaîne d'entrée (ou que ce que la méthode fait avec le document est correct, mais vous avez omis la partie importante). –

+0

Afin de faire ce qui suit, j'ai besoin d'autres Mocks: \t \t Mockito.when (docBuilder.parse (entréeSrc)) thenReturn (docMock); – Tiya

+0

'DocumentBuilderFactory.newInstance()' est une méthode statique. Et pour se moquer d'une méthode statique, vous devez utiliser powermock: https://github.com/powermock/powermock/wiki/MockStatic –

Répondre

0

Le test unitaire est destiné à tester vos composants/classes, et non les composants/classes de la bibliothèque utilisés. Votre classe analyse une chaîne en tant que contenu xml et pour tester cela, vous trouverez que fournir un ensemble de chaînes xml avec une sortie connue est la meilleure façon de tester. Il suffit de passer une chaîne xml connue à votre classe testée et d'affirmer que le modèle résultant analysé contient les données que vous attendez pour ce contenu xml. Je ne pense pas que vous ayez besoin de moqueries. Mockito ne peut pas se moquer des méthodes statiques.