Vra

Ek is tans besig om Mockito te gebruik om my dienslaagvoorwerpe te bespot in 'n lente MVC -toepassing waarin ek my beheerdermetodes wil toets. Aangesien ek egter gelees het oor die besonderhede van Mockito, het ek gevind dat die metodes doReturn(...).when(...) is gelykstaande aan when(...).thenReturn(...). My vraag is dus wat die punt is om twee metodes te hê wat dieselfde doen of wat die subtiele verskil tussen is doReturn(...).when(...) en when(...).thenReturn(...)?

Enige hulp sal waardeer word.

Was dit nuttig?

Oplossing

Die twee sintaksis vir stoppels is ongeveer gelyk. U kan egter altyd gebruik doReturn/when vir Stubbing; Maar daar is gevalle waar u nie gebruik when/thenReturn. Stubbing Void -metodes is so. Ander sluit in gebruik met bespotlike spioene, en om dieselfde metode meer as een keer te stomp.

Een ding wat when/thenReturn gee jou, dit doReturn/when Dit is nie, is die tipe kontrole van die waarde wat u terugkeer op die tydstip. Ek glo egter dat dit van byna geen waarde is nie - as u die tipe verkeerd het, sal u uitvind sodra u u toets uitvoer.

Ek beveel sterk aan om slegs te gebruik doReturn/when. Dit is geen sin om twee sintaksis te leer wanneer een dit sal doen nie.

Miskien wil u na my antwoord verwys by Vorm Mockito "Grammars" - 'n Meer gedetailleerde antwoord op 'n baie nou verwante vraag.

Ander wenke

Albei benaderings gedra hulle anders as u 'n gespanne voorwerp gebruik (geannoteer met @Spy) in plaas van 'n bespot (geannoteer met @Mock):

  • when(...) thenReturn(...) maak 'n regte metode -oproep Net voordat die gespesifiseerde waarde teruggestuur word. As die genoemde metode dus 'n uitsondering gooi, moet u dit hanteer / bespot, ens. Natuurlik kry u steeds u resultaat (wat u definieer thenReturn(...))

  • doReturn(...) when(...) noem die metode glad nie.

Voorbeeld:

public class MyClass {
     protected String methodToBeTested() {
           return anotherMethodInClass();
     }

     protected String anotherMethodInClass() {
          throw new NullPointerException();
     }
}

Toets:

@Spy
private MyClass myClass;

// ...

// would work fine
doReturn("test").when(myClass).anotherMethodInClass();

// would throw a NullPointerException
when(myClass.anotherMethodInClass()).thenReturn("test");

Dit lyk asof die Mockito Javadoc sê waarom gebruik doReturn() in plaas van when()Gebruik doreturn () in daardie seldsame geleenthede wanneer u nie Mockito kan gebruik nie. Wanneer (voorwerp).

Pasop dat Mockito.Wan (Object) altyd aanbeveel word vir Stubbing, want dit is argumenttipe-veilige en meer leesbaar (veral as u opeenvolgende oproepe opspoor).

Hier is die seldsame geleenthede wanneer doreturn () handig is:

1. As u regte voorwerpe spioeneer en regte metodes op 'n spioen noem, bring dit newe -effekte

List list = new LinkedList(); List spy = spy(list);

// onmoontlik: regte metode word so Spy.get (0) genoem. Gooi indekoutofBoundSexception (die lys is nog leeg)

when(spy.get(0)).thenReturn("foo");

// U moet doreturn () gebruik vir stomp: doReturn("foo").when(spy).get(0);

2. Oorskryding van 'n vorige uitsondering-stubbering:

when(mock.foo()).thenThrow(new RuntimeException());

// onmoontlik: die Foo () -metode wat deur uitsondering gestop is, word so genoem dat RuntimeException gegooi word. when(mock.foo()).thenReturn("bar");

// U moet doreturn () gebruik vir stomp:

doReturn("bar").when(mock).foo(); Bo scenario's toon 'n uitruil van Mockito se elegante sintaksis. Let egter daarop dat die scenario's egter baie skaars is. Spoor moet sporadies wees en die uitsonderingstop is baie skaars. Om nie te praat dat die oorheersing van stoppels 'n potensiële kode -reuk is wat te veel stamp uitwys nie.

Voortsetting Hierdie antwoord, Daar is nog 'n verskil dat as u wil hê dat u metode verskillende waardes moet teruggee, byvoorbeeld wanneer dit die eerste keer genoem word, tweede keer genoem, ens., Kan u waardes deurgee, so byvoorbeeld ...

PowerMockito.doReturn(false, false, true).when(SomeClass.class, "SomeMethod", Matchers.any(SomeClass.class));

Dit sal dus vals terugkeer as die metode in dieselfde toetssaak genoem word, en dan sal dit weer vals terugkeer en uiteindelik waar.

Laasgenoemde alternatief word gebruik vir metodes op bespotings wat terugkeer void.

Kyk byvoorbeeld hier:Hoe om bespot tot nietige metodes met Mockito te maak

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top