9 votes

EasyMock renvoie Null pour la méthode attendue

Je rencontre un problème avec EasyMock qui renvoie null pour un appel de méthode attendu (défini).

Création de l'objet simulé

mock = EasyMock.createMock(DAO.class);

Configuration du mock dans le test unitaire.

expect(mock.update(myObj).andReturn(myObjUpdated).once();
replayAll();
service.setDao(mock);
service.processData(myObj);
verifyAll();

La méthode processData appelle simplement

MyObject objUpdated = dao.update(myObj);

Voici l'interface à partir de laquelle le mock est construit.

public interface DAO {
   public  ENTITY update(ENTITY entity);
}

Je suis assez confus quant à ce qui pourrait causer le problème. J'ai confirmé que 'obj' est le même objet que j'ai défini dans le test unitaire. Je n'ai également pas rencontré ce problème (que je sache) avec d'autres méthodes simulées.

Le problème pourrait-il être avec l'objet qui est passé en paramètre ?

Merci d'avance. Je ne suis vraiment pas sûr des autres informations qui pourraient vous être utiles ici.

éditer : ceci est la classe de test (et comme il s'avère, là où a commencé ma confusion)

public class TestMyService extends EasyMockHelper {...}

13voto

Seth M. Points 283

Il s'avère que mon principal problème n'est pas avec les attentes ou même avec la création de l'objet fictif. J'avais une incompréhension fondamentale sur le fonctionnement de la classe EasyMockSupport dont mon test hérite. Ce point n'est pas très bien couvert dans la documentation, mais si vous examinez de plus près les exemples, mon erreur devient évidente.

La classe EasyMockSupport donne à ma classe de test accès à des méthodes telles que replayAll(), verifyAll() et resetAll(). Ce qu'elles font, c'est me permettre de ne plus m'inquiéter de contrôler manuellement chaque objet fictif créé. Cependant, ce que la documentation a omis de mentionner, c'est que vous devez créer votre objet fictif EN UTILISANT les méthodes fournies par la classe EasyMockSupport afin qu'elle puisse enregistrer correctement les contrôles. ((cela a un sens total d'ailleurs, je ne le lisais simplement nulle part)). La classe EasyMockSupport, si vous regardez dans l' API, fournit à la classe enfant toutes les méthodes qu'elle utiliserait normalement statiquement depuis la classe EasyMock, telles que createMock(Class class).

Donc, pour le code mis à jour

public class TestMyService extends EasyMockSupport {
   private MyService service;
   private MyDao dao;

   private MyObject myObj;

   @Before public void setUp() {
      service = new MyService();

      // C'EST LA CLÉ
      mock = createMock(IDao.class); //CORRECT
      // mock = EasyMock.createMock(IDao.class); //WRONG

      service.setDao(mock);
      myObj = new MyObject("expectedData");
   }
   @After public void tearDown() {
      verifyAll();
   }
   @Test public void testMyService() {
      expect(mock.update(myObj)).andReturn(myObj);
      replayAll();
      service.myService(myObj);
   }
}

public class MyService() {
   private IDao dao;
   public void setDao(IDao dao) {this.dao = dao; }
   public MyObject myService(MyObject myObj) {
      return dao.update(myObj);
   }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X