Mockito lorsque () ne différencie pas les classes enfants

J’ai écrit un test qui utilise Mockito 1.9.5. J’ai un HttpGet et un HttpPost qu’un HttpClient exécute, et je teste pour vérifier que la réponse de chacun renvoie le résultat attendu sous la forme d’un stream d’entrée.

Le problème est que lorsque vous utilisez Mockito.when(mockedClient.execute(any(HttpPost.class))).thenReturn(postResponse) et Mockito.when(mockedClient.execute(any(HttpGet.class))).thenReturn(getResponse) , où les réponses sont des objects différents, mockedClient.execute() renvoie toujours getResponse .

Le test que j’ai écrit est ci-dessous:

 private InputStream postContent; private InputStream getContent; @Mock private FilesHandler hand; @Mock private MockHttpClient client; private MockHttpEntity postEntity; private MockHttpEntity getEntity; private MockHttpResponse postResponse; private MockHttpResponse getResponse; private Ssortingng imgQuery = "someQuery"; private ParametersHandler ph; private FileHandlerImpl fileHand; private Ssortingng indexFolder = "src/test/resources/misc/"; private Ssortingng indexFile = "index.csv"; @Before public void setUp() { MockitoAnnotations.initMocks(this); try { postContent = new FileInputStream(indexFolder + "testContent.txt"); postEntity = new MockHttpEntity(postContent); postResponse = new MockHttpResponse(postEntity, new BasicStatusLine(new ProtocolVersion("http", 1, 1), 200, "postReasonPhrase")); getContent = new FileInputStream(indexFolder + "testContent.txt"); getEntity = new MockHttpEntity(getContent); getResponse = new MockHttpResponse(getEntity, new BasicStatusLine(new ProtocolVersion("http", 1, 1), 200, "getReasonPhrase")); ph = new ParametersHandler(); fileHand = new FileHandlerImpl(client, ph, indexFolder, indexFile); } catch (Exception e) { failTest(e); } } @Test public void getFileWhenEverythingJustWorks() { try { Mockito.when(client.execute(Mockito.any(HttpPost.class))).thenReturn(postResponse); Mockito.when(client.execute(Mockito.any(HttpGet.class))).thenReturn(getResponse); fileHand.getFile(hand, imgQuery, ph, "I"); Mockito.verify(hand).rebuildIndex(Mockito.any(Ssortingng.class), Mockito.any(Map.class), Mockito.any(Map.class), hand); } catch (IOException e) { failTest(e); } } 

Une version abrégée de la méthode testée est ci-dessous.

 public void getFile(FilesHandler fileHandlerFl, Ssortingng query, ParametersHandler ph, Ssortingng type) { JsonFactory factory = new JsonFactory(); HttpPost post = preparePost(query, factory); CloseableHttpResponse response = client.execute(post); Ssortingng uri = "https://someuri.com" + "/File"; HttpGet get = new HttpGet(uri); setParameters(get); response.close(); response = client.execute(get); } 

Comme toujours, toute aide que vous pouvez apporter est appréciée.

Malgré ce que cela signifierait en anglais, dans Mockito 1.x, any(HttpGet.class) correspond à n’importe quelle valeur et pas seulement à un HttpGet . Le paramètre est uniquement utilisé pour enregistrer une dissortingbution antérieure à Java 8.

De la documentation Matchers.any (Class) :

Correspond à n’importe quel object, y compris les null

Cette méthode ne fait pas les vérifications de type avec le paramètre donné, il est seulement là pour éviter de lancer dans votre code. Cela pourrait toutefois changer (des vérifications de type pourraient être ajoutées) dans une prochaine version majeure.

Utilisez isA(HttpGet.class) et isA(HttpPost.class) place, et voyez le commentaire de Brice ci-dessous sur les modifications futures de any(Class clazz) matcher any(Class clazz) .