2010-05-06 10 views
2

Je tente d'écrire des tests unitaires en utilisant EasyMock et TestNG et j'ai rencontré une question. Compte tenu de ce qui suit:Valeur de test de test avec EasyMock

void execute(Foo f) { 
    Bar b = new Bar() 
    b.setId(123); 
    f.setBar(b); 
} 

Je suis en train de vérifier que l'ID de la barre se prépare en conséquence de la façon suivante:

@Test 
void test_execute() { 
    Foo f = EasyMock.createMock(Foo.class); 

    execute(f); 

    Bar b = ?; // not sure what to do here 
    f.setBar(b); 
    f.expectLastCall(); 
} 

Dans mon test, je ne peux pas simplement appeler f.getBar() et inspecter son ID car f est un objet fantaisie. Des pensées? Est-ce là où je voudrais regarder les additions EasyMock v2.5 andDelegateTo() et andStubDelegateTo()?

Oh, et juste pour l'enregistrement ... la documentation de EasyMock souffle.

+0

Je crois que si vous créez la même barre, cela fonctionnerait. Pourquoi n'essaies-tu pas? –

+0

Je crois comprendre que cette approche s'appuierait sur l'implémentation de Bar.equals() plutôt que sur l'implémentation de ma méthode execute(). Bien que je pense que cela fonctionnerait, il semble qu'il y ait une meilleure façon. – fmpdmb

+1

oui, vous affirmeriez que l'instance de barre transmise à la maquette est égale à celle que vous attendez. Si votre méthode 'equals()' de Bar n'est pas suffisante pour satisfaire ce que vous voulez tester, ou si vous testez plus de champs que vous ne le souhaitez dans votre test, capture est une meilleure option (bien que cela soulève la question de Bar. égal à() n'est pas suffisant). –

Répondre

8

Ah ah! La capture est la clé.

@Test 
void test_execute() { 
    Foo f = EasyMock.createMock(Foo.class); 

    Capture<Bar> capture = new Capture<Bar>(); 
    f.setBar(EasyMock.and(EasyMock.isA(Bar.class), EasyMock.capture(capture))); 
    execute(f); 

    Bar b = capture.getValue(); // same instance as that set inside execute() 
    Assert.assertEquals(b.getId(), ???); 
} 
+0

Pour une explication plus détaillée, consultez mon tutoriel EasyMock (en particulier la partie 3): https: // turnlevel. com/2013/05/28/easymock-fundamentals-3/ – fmpdmb

0
f.setBar(EasyMock.isA(Bar.class)) 

Ceci s'assurera que setBar a été appelé avec une classe Bar en tant que paramètre.

0

Je construis un objet qui est equal à celui que je pense à revenir. Dans ce cas, je créerais un new Bar et définirais son ID à 123, en comptant sur l'implémentation correcte de equals() et hashCode() de Bar et le comportement par défaut de EasyMocks argument matcher (en utilisant la comparaison égale pour les paramètres).

@Test 
public void test_execute() { 
    Foo f = EasyMock.createMock(Foo.class); 
    Bar expected = new Bar(); 
    expected.setId(123); 
    f.setBar(expected); 
    EasyMock.expectLastCall(); 
    EasyMock.replay(f); 

    execute(f); 

    EasyMock.verify(f); 
} 
+0

Je dirais qu'il s'agit plus d'un test de l'implémentation de Bar que de la méthode que vous avez l'intention de tester. – fmpdmb

1

Avez-vous essayé? `

final Bar bar = new Bar(); 
bar.setId(123); 
EasyMock.expect(f.getBar()).andAnswer(new IAnswer<Bar>() { 
    public Bar answer() {    
     return bar; 
    } 
}); 

Je ne suis pas sûr de la syntaxe au-dessus de ma tête, mais cela devrait fonctionner.