Comment injecter EasyMock maquette en classe testée domaine privé
Je suis à l'aide d'EasyMock de créer des maquettes qui est l'un des privés paramètres (sans les setter) dans la classe testée. J'ai essayé d'utiliser la réflexion, mais il ne fonctionne pas correctement.
public class TestedClassTest{
@Test
public void test(){
TestedClass instance = new TestedClass();
MockedClass mocked = EasyMock.createMock(MockedClass.class);
Data data = new Data();
//Void setter
DataType dataType = (myDataType.DataType) EasyMock.anyObject();
mocked.setDataType(dataType);
EasyMock.expectLastCall();
//expect
EasyMock.expect(mocked.getData()).andReturn(data);
EasyMock.replay(mocked);
Field field = instance.getClass().getDeclaredField("mockedClass")
field.setAccessible(true);
field.set(instance, mocked);
//run tested method
instance.someAction();
EasyMock.verify(mocked);
}
}
Im obtenir ÉCHOUÉ info:
Unexpected method call MockedClass.setDataType(myData.MyData@104306d75):
MockedClass.getData(): expected: 1, actual: 0
junit.framework.AssertionFailedError:
Unexpected method call MockedClass.setDataType(myData.MyData@132006d75):
MockedClass.getData(): expected: 1, actual: 0
Je suis sûr que cette méthode est tiré sur des "MockedClass" objet lors de l'essai "de l'instance.uneaction()"
Comment résoudre ce problème?
Édité Réponse :
Après correction doublé replay.mocked()
j'ai trouvé (si simple!) encore une méthode void doit être déclarée à l'aide de EasyMock.expectLastCall()
OriginalL'auteur Marcin | 2012-04-04
Vous devez vous connecter pour publier un commentaire.
Votre code de réflexion a l'air bien.
Il a été un long temps depuis que je l'ai utilisé EasyMock, mais n'est-ce pas
replay
supposé être appelée une fois par fantaisie dans un test? Vous appelez deux fois. Essayer de se débarrasser de la premièrereplay
appel.Dans ce cas, est-il judicieux d'avoir le champ qui contient la maquette être public? En général, les collaborateurs doivent être définies soit par le constructeur ou setter, éliminant le besoin de réflexion à tous.
EDIT -- basé sur vos mises à jour -- l'erreur indique
setDataType
a été appelée sur la maquette, mais la maquette n'a pas s'attendre à être appelé. Peut-être que votre classe est de l'appeler deux fois, c'est peut-être appelés à sortir de l'ordre, ou de l'appeler avec un argument vous ne vous attendiez pas (même si je m'attends à ce que l'erreur d'être différent dans ce cas).r u certain que l'erreur est la même?
édité code et l'erreur, thx!
vous êtes toujours appeler le relire deux fois, selon le code
faire trop de choses en même temps, désolé. Il y a seulement une relecture maintenant. En fonction de votre question sur les setter - il n'est pas possible, parce que la classe testée ne peut pas être modifié.
OriginalL'auteur hvgotcodes