Kaip paslėpti neteisingus metodus su „mockito“

Kaip nuvalyti metodus su grąžinimo tipu?

Įgyvendinau stebėtojo šabloną, bet aš negaliu juoktis su Mockito, nes nežinau, kaip tai padaryti.

Ir aš bandžiau rasti pavyzdį internete, bet aš negalėjau.

Mano klasė atrodo

 public class World { List<Listener> listeners; void addListener(Listener item) { listeners.add(item); } void doAction(Action goal,Object obj) { setState("i received"); goal.doAction(obj); setState("i finished"); } private string state; //setter getter state } public class WorldTest implements Listener { @Test public void word{ World w= mock(World.class); w.addListener(this); ... ... } } interface Listener { void doAction(); } 

Sistema nepradeda su išdėstymu. lygus ženklas Noriu parodyti aukščiau nurodytą sistemos būseną. Ir padarykite jiems pareiškimą.

646
16 февр. ibrahimyilmaz yra nustatytas 16 vasario mėn. 2010-02-16 23:54 '10, 11:54 PM 2010-02-16 23:54
@ 9 atsakymai

Vadinamosios problemos sprendimas yra naudoti spy Mockito.spy“ (...) vietoj „ Mockito.mock“ (..) .

Šnipas leidžia mums iš dalies sumaišyti. Mokito yra gerai. Kadangi jūs turite klasę, kuri nėra išsami, taigi jūs išgirsite tam tikrą būtiną vietą šioje klasėje.

41
18 февр. Atsakymą pateikė ibrahimyilmaz , vasario 18 d. 2010-02-18 11:48 '10, 11:48, 2010-02-18 11:48

Pažvelkite į Mockito API API dokumentus. Kaip minimas susijęs dokumentas (12 punktas), galite naudoti bet kurį iš „ doThrow() , „ doAnswer() , „ doNothing() , „ doReturn() metodų iš „Mockito“ sistemos, kad ištirtumėte tuos metodus.

Pavyzdžiui

 Mockito.doThrow(new Exception()).when(instance).methodName(); 

arba jei norite sujungti jį su vėlesniu elgesiu,

 Mockito.doThrow(new Exception()).doNothing().when(instance).methodName(); 

Darant prielaidą, kad jūs žiūrite į žemiau pateiktą pasaulinę klasę setState(String s) pasityčiojimą, kodas naudoja „ doAnswer metodą, kad setState .

 World mockWorld = mock(World.class); doAnswer(new Answer<Void>() { public Void answer(InvocationOnMock invocation) { Object[] args = invocation.getArguments(); System.out.println("called with arguments: " + Arrays.toString(args)); return null; } }).when(mockWorld).setState(anyString()); 
830
17 февр. atsakymas pateikiamas sateesh 17 vas. 2010-02-17 07:02 '10 at 7:02 2010-02-17 07:02

Manau, kad rasti paprastesnį atsakymą į šį klausimą, norėdamas paskambinti tikruoju metodu tik vienam metodui (net jei jis negalioja), galite tai padaryti:

 Mockito.doCallRealMethod().when(<objectInstance>).<method>(); <objectInstance>.<method>(); 

Arba galite nurodyti tikrąjį metodą visiems šios klasės metodams atlikdami šiuos veiksmus:

 <Object> <objectInstance> = mock(<Object>.class, Mockito.CALLS_REAL_METHODS); 
68
10 июня '14 в 23:41 2014-06-10 23:41 atsakymas duotas MarcioB birželio 14 d. 14:41 2014-06-10 23:41

Pridedant, ką sakė @sateesh, kai tik norite pasimėgauti negaliojančiu metodu, kad šis skambutis nebūtų naudojamas, galite naudoti tokį „ Spy :

 World world = new World(); World spy = Mockito.spy(world); Mockito.doNothing().when(spy).methodToMock(); 

Jei norite atlikti savo testą, įsitikinkite, kad skambinate į „ Spy objekto testą, o ne world objektą. Pavyzdžiui:

 assertEquals(0,spy.methodToTestThatShouldReturnZero()); 
39
09 янв. Atsakymas pateikiamas Omri374 09 sausis 2015-01-09 23:08 '15 - 23:08 2015-01-09 23:08

Visų pirma: visada turėtumėte importuoti „mockito“ statinį, todėl kodas bus daug lengviau skaitomas (ir intuityvus):

 import static org.mockito.Mockito.*; 

Dėl dalinio patyčių ir originalios funkcionalumo išsaugojimo likusios mockito siūlo „šnipą“.

Ją galite naudoti taip:

 private World world = spy(World.class); 

Jei norite pašalinti metodo vykdymą, galite naudoti kažką panašaus:

 doNothing().when(someObject).someMethod(anyObject()); 

suteikti metodui tam tikrą elgesį, naudokite „kai“ su „tadaReturn“:

 doReturn("something").when(this.world).someMethod(anyObject()); 

Daugiau pavyzdžių rasite dokumente esančiais pavyzdžiais.

17
11 нояб. atsakymas pateikiamas fl0w 11 nov. 2016-11-11 17:51 '16 at 17:51 pm 2016-11-11 17:51

Kaip paslėpti negaliojančius metodus su „mockito“ - yra dvi parinktys:

  • doAnswer - Jei norime, kad mūsų doAnswer negaliojantis metodas kažką atliktų (išgąsdindamas elgesį, nepaisant to, kad jis buvo neteisingas).
  • doThrow - Tada yra „ Mockito.doThrow() jei norite išmesti išimtį iš Mockito.doThrow() negaliojančio metodo.

Žemiau pateikiamas pavyzdys, kaip jį naudoti (ne tobulas naudojimosi būdas, bet tik norėjau iliustruoti pagrindinį naudojimą).

 @Test public void testUpdate() { doAnswer(new Answer<Void>() { @Override public Void answer(InvocationOnMock invocation) throws Throwable { Object[] arguments = invocation.getArguments(); if (arguments != null  arguments.length > 1  arguments[0] != null  arguments[1] != null) { Customer customer = (Customer) arguments[0]; String email = (String) arguments[1]; customer.setEmail(email); } return null; } }).when(daoMock).updateEmail(any(Customer.class), any(String.class)); // calling the method under test Customer customer = service.changeEmail("old@test.com", "new@test.com"); //some asserts assertThat(customer, is(notNullValue())); assertThat(customer.getEmail(), is(equalTo("new@test.com"))); } @Test(expected = RuntimeException.class) public void testUpdate_throwsException() { doThrow(RuntimeException.class).when(daoMock).updateEmail(any(Customer.class), any(String.class)); // calling the method under test Customer customer = service.changeEmail("old@test.com", "new@test.com"); } } 

Daugiau informacijos apie bandomuosius ir testavimo negaliojančius metodus galite rasti naudodami „Mockito“ mano įraše. Kaip paslėpti Mockito (išsami pamoka su pavyzdžiais)

11
25 мая '17 в 3:26 2017-05-25 03:26 Atsakymą davė Dilini Rajapaksha gegužės 17 d. 17 d

Įtraukus kitą atsakymą į krūvelę (neskirta baudai) ...

Jei negalite naudoti šnipo, turite skambinti „doAnswer“ metodu. Tačiau atsakymo nereikia. Yra keletas numatytųjų diegimų. Pažymėtina, kad skambučiaiRealMethods .

Praktiškai tai atrodo taip:

 doAnswer(new CallsRealMethods()).when(mock) .voidMethod(any(SomeParamClass.class)); 

Arba:

 doAnswer(Answers.CALLS_REAL_METHODS.get()).when(mock) .voidMethod(any(SomeParamClass.class)); 
10
19 марта '14 в 20:41 2014-03-19 20:41 Atsakymą pateikė javamonkey79 kovo 19, 14, 20:41 2014-03-19 20:41

Manau, kad jūsų problemos yra susijusios su jūsų bandymo struktūra. Man buvo sunku juoktis dėl tradicinio metodo, skirto bandymų klasės sąsajoms įgyvendinti (kaip ir jūs).

Jei klausytoją įdiegiate kaip išdėstymą, galite išbandyti sąveiką.

 Listener listener = mock(Listener.class); w.addListener(listener); world.doAction(..); verify(listener).doAction(); 

Tai turėtų tenkinti jus, kad „pasaulis“ daro teisingą dalyką.

4
07 июля '14 в 10:56 2014-07-07 10:56 atsakymas pateikiamas ashley liepos 7 d. 14 d. 10:56 2014-07-07 10:56

@ashley: dirba man

 public class AssetChangeListenerImpl extends AbstractAssetChangeListener implements AssetChangeListener { @Override public void onChangeEvent(final EventMessage message) throws EventHubClientException { execute(message); } } } public class AbstractAssetChangeListener { protected void execute( final EventMessage message ) throws EventHubClientException { executor.execute( new PublishTask(getClient(), message) ); } } @RunWith(MockitoJUnitRunner.class) public class AssetChangeListenerTest extends AbstractAssetChangeListenerTest { public void testExecute() throws EventHubClientException { EventMessage message = createEventMesage(EventType.CREATE); assetChangeListener.execute(message); verify(assetChangeListener, times(1)).execute(message); } } 
0
14 февр. Atsakymą pateikė Gowda vasario 14 d. 2017-02-14 02:33 '17, 2:33 2017-02-14 02:33