2017-09-05 4 views
2

Vous vous demandez simplement comment vous pouvez vous moquez d'un objet de retour de type Class d'une méthode utilisant EasyMock ou PowerMock?EasyMock et les méthodes retournant une classe générique

Je suis en train de se moquer du type de retour de cette méthode d'interface

Class<T> getRootBeanClass(); 

J'ai essayé ce qui suit, mais sans joie

EasyMock.expect(mockViolation.getRootBeanClass()).andReturn(EasyMock.anyObject()); 

Je reçois ce message d'erreur

java.lang.IllegalStateException: matcher calls were used outside expectations 

Toute aide est grandement appréciée

+1

Juste pour l'enregistrement: vous voudrez peut-être supprimer les anciens commentaires qui ne sont plus nécessaires ... – GhostCat

Répondre

2

anyObject() est un argument matcher.

Vous l'utilisez pour que EasyMock puisse distinguer entre les différentes spécifications de dérogation que vous avez affichées. Comme:

EasyMock.expect(mock.foo(eq("A"), anyObject()).andReturn(resultForA); 

contre

EasyMock.expect(mock.foo(eq("B"), anyObject()).andReturn(resultForB); 

L'objet que vous retour doit être un réel objet existant (qui peut être moquée, ou ne se moque pas). Mais anyObject() ne crée pas d'objet pour vous!

EasyMock ne peut pas générer des génériques pour vous - donc aurait besoin d'un casting, quelque chose comme:

Class<Foo> foo = (Class<Foo>) mock(Class.class) 

Mais cela ne fonctionne pas dans ce cas - comme java.lang.Class est définitive! Et EasyMock ne peut pas se moquer des classes finales! Vous avez besoin de PowerMock pour cela - ou (ma recommandation) la dernière version de Mockito.

Dans le cas où vous allez pour Mockito: s'il vous plaît lire leur documentation - comme vous devez activer moqueur des classes finales - c'est une fonctionnalité expérimentale dès maintenant.