2010-01-21 9 views
6

J'essaye d'installer un test dans JUnit avec EasyMock et je rencontre un petit problème que je n'arrive pas à comprendre. J'espérais que quelqu'un ici pourrait aider.JUnit Easymock Appel de méthode inattendue

Voici une version simplifiée de la méthode que je suis en train de tester:

public void myMethod() { 
    //(...) 
    Obj myObj = this.service.getObj(param); 
    if (myObj.getExtId() != null) { 
     OtherObj otherObj = new OtherObj(); 
     otherObj.setId(myObj.getExtId()); 
     this.dao.insert(otherObj); 
    } 
    //(...) 
} 

Ok, donc en utilisant EasyMock j'ai raillé l'appel service.getObj(myObj) et qui fonctionne bien.

Mon problème survient lorsque JUnit atteint l'appel dao.insert(otherObj). EasyMock lance un *Unexpected Method Call* dessus.

Je ne me dérangerait pas que se moquant dao dans mon test et en utilisant expectLastCall().once(); là-dessus, mais cela suppose que j'ai une poignée sur le « otherObj » qui est passé comme paramètre à insérer l'heure ... Ce qui bien sûr, je Ne le faites pas puisque c'est créé conditionnellement dans le contexte de la méthode testée.

Quelqu'un a déjà dû faire face à cela et en quelque sorte résolu?

Merci.

Répondre

9

Si vous ne parvenez pas à obtenir une référence à l'objet lui-même dans votre code de test, vous pouvez utiliser EasyMock.anyObject() comme argument attendu de votre méthode insert. Comme son nom l'indique, il s'attend à ce que la méthode soit appelée avec ... eh bien, n'importe quel objet :)

C'est peut-être un peu moins rigoureux que de faire correspondre l'argument exact, mais si vous êtes satisfait, donnez-lui un tourner. N'oubliez pas d'inclure la conversion à OtherObj lors de la déclaration de l'appel de méthode attendu.

+0

Yep qui a fait l'affaire merci DoctorRuss. :) – Lancelot

12

Vous pouvez également utiliser EasyMock.isA(OtherObj.class) pour un peu plus de sécurité de type.

5

Le matcher anyObject() fonctionne très bien si vous voulez simplement passer cet appel, mais si vous voulez réellement valider l'objet construit, c'est ce que vous pensiez qu'il allait être, vous pouvez utiliser Capture. Il ressemblerait à quelque chose comme:

Capture<OtherObj> capturedOtherObj = new Capture<OtherObj>(); 
mockDao.insert(capture(capturedOtherObj)); 
replay(mockDao); 

objUnderTest.myMethod(); 

assertThat("captured what you expected", capturedOtherObj.getValue().getId(), 
      equalTo(expectedId)); 

En outre, PowerMock a la capacité d'attendre un objet à construire, de sorte que vous pouvez regarder dans que si vous vouliez.

1

Notez également que si vous utilisez EasyMock.createStrictMock();, l'ordre des appels de méthode est également important et si vous ne respectez pas cette règle, il lancera un appel de méthode inattendu.