2015-12-11 11 views
6

This post sugeruje zarówno - że istnieje różnica (patrz komentarz użytkownika SnoopyMe) i że te dwa mogą być używane zamiennie. Dokumentacja EasyMock nie wspomina o żadnej różnicy.Czy jest jakaś różnica między ".i Zwrotem (...). AnyTimes()" i ".andStubReturn (...)" w EasyMock?

Czy istnieje jakaś różnica, zarówno w sensie praktycznym, jak i semantycznym? Jeśli tak, to kiedy lepiej użyć jednego z nich zamiast drugiego?

EDIT:

Poniższe badanie sugeruje, że istnieje różnica, przynajmniej jeśli używane ze ścisłą mock.

@Test 
public void testTestMe() { 
    Bar bar = createStrictMock(Bar.class); 
    expect(bar.doBar()).andReturn(1).anyTimes(); 
    expect(bar.doOtherBar()).andReturn(2).once(); 
    replay(bar); 

    Foo foo = new Foo(bar); 
    foo.testMe(); 
    verify(bar); 
} 

@Test 
public void testTestMeAgain() { 
    Bar bar = createStrictMock(Bar.class); 
    expect(bar.doBar()).andStubReturn(1); 
    expect(bar.doOtherBar()).andReturn(2).once(); 
    replay(bar); 

    Foo foo = new Foo(bar); 
    foo.testMe(); 
    verify(bar); 
} 

public class Foo { 
    private final Bar _bar; 
    public Foo(Bar bar) { 
     _bar = bar; 
    } 

    public void testMe() { 
     _bar.doBar(); 
     _bar.doOtherBar(); 
     _bar.doBar(); 
    } 
} 

andReturn (...) anyTimes() nadal weryfikuje zamówienie, który jest egzekwowany przez ścisłą próbę weryfikacji. iStubReturn (...) jednak nie.

Jednak nadal nie jest dla mnie jasne, czy jest to jedyna różnica, czy też różnica semantyczna. Na przykład, czy anyTimes() jest takie samo jak stubReturn() dla zwykłego (nie surowego) mocku?

Odpowiedz

4

Różnica jest niewielka pod względem wyników. Dla zwykłej sztuczki jest taka sama. Jednak w przypadku ścisłej sztuczki można ją wywołać w dowolnym momencie bez szacunku dla zamawiającego. anyTimes można wywoływać w dowolnym momencie, ale tylko w zapisanej kolejności.

Ta różnica wynika z różnicy semantycznej. Stub jest czymś, co można wywołać w dowolnym momencie podczas testu i nie obchodzi cię, kiedy i ile razy. W rzeczywistości większość wyśmianych metod jest ogólnie pojęta.

Następnie anyTimes oznacza, że ​​ci zależy. Ale w rzeczywistości nigdy go nie używam. Kiedy robię test, wiem, co się stanie. Moje metody są zawsze upychane lub oczekuje się, że będą nazywane dokładnym czasem.

Powiązane problemy