2010-09-14 10 views

Répondre

0

j'ai réussi à trouver une solution:

expectLastCall().andAnswer(new IAnswer() { 
    public Object answer() { 
     Assert.assertFail(); 
     return null; 
    } 
}); 
+0

Pour moi cela ne fonctionne pas. Il dit "attendu: 1, réel: 0". – Vic

+1

convenu que cela ne fonctionne pas. La bonne réponse vient de David Nguyen. – dhaag23

1

Cela ressemble à un bug pour moi. La classe interne Range ne permet pas de définir un maximum inférieur à 1.

Vous ne pouvez pas vous moquer de cette méthode et appeler simplement Assert.fail()?

+0

oui, je l'ai fait de cette façon finalement, voir ma réponse – nkr1pt

1

Si vous vous attendez à votre méthode de ne pas être appelé alors juste n'enregistrer pas. Mais je suis d'accord que ça ne marchera pas avec un joli simulacre.

8

avec easymock 3.0, vous devez ajouter un .anyTimes() sur le expectLastCall ou le test échouera:

Expectation failure on verify: myMethod(): expected: 1, actual: 0` 

exemple basé sur nkr1pt:

expectLastCall().andAnswer(new IAnswer() { 
    public Object answer() { 
     Assert.assertFail(); 
     return null; 
    } 
}).anyTimes(); 
+3

Je pense: Assert.assertFail(); devrait juste être: Assert.fail(); – Matt

+1

Bien que ce soit une réponse efficace, j'aime mieux celle de David Wallace, car elle est moins verbeuse. – qben

7

Le fait qu'une méthode n'est pas appelé est contrôlé par Mock ou StrictMock. Ils lèveront une exception, quand cette méthode non enregistrée est appelée. Ce problème se produit uniquement lorsque vous utilisez NiceMock s, où les valeurs par défaut sont renvoyées lors de l'appel de méthodes non enregistrées.

Ainsi, une solution peut être pour ne pas utiliser NiceMock s.

+2

Je suis fortement en désaccord avec la conclusion. Peut-être, dans ce cas, une belle maquette n'est pas le meilleur choix. Mais si vous voulez vous assurer qu'une méthode ne sera pas appelée, en fait c'est la seule chose que vous voulez tester, il est préférable de souligner ceci avec une méthode simulée qui échoue avec un message approprié. – qben

+1

C'est un bon argument. Je voulais pointer celui-ci, puisque je suis tombé sur pourquoi je ne peux pas spécifier 'times (0)'. Et seulement plus tard, je me suis rendu compte que ce genre de contradiction avec l'idée d'une belle moquerie, et pas une belle moquerie ne permet pas d'exécuter des méthodes non enregistrées. Jeter une exception d'affirmation comme la réponse semblait plus comme une solution de contournement pour moi et que les appels de méthode 0 devraient être spécifiés en utilisant pas de beaux simulacres. Peut-être que je suis un peu affirmatif dans la conclusion. Je vais juste le corriger. – Vic

16

Vous pouvez utiliser .andThrow(new AssertionFailedError()).anyTimes(); - c'est la même exception que Assert.fail() lancers francs, mais est moins bavard que de faire un Answer.

+2

Peut-être que l'ajout d'une bonne description des raisons pour lesquelles le test a échoué améliore encore cette solution (qui est la meilleure de toutes les IMO ici). – qben