Ще один варіант - покладатися на старий хороший equals
спосіб моди . Поки аргумент в when
макеті equals
аргументується в тестованому коді, тоді Mockito буде відповідати макеті.
Ось приклад.
public class MyPojo {
public MyPojo( String someField ) {
this.someField = someField;
}
private String someField;
@Override
public boolean equals( Object o ) {
if ( this == o ) return true;
if ( o == null || getClass() != o.getClass() ) return false;
MyPojo myPojo = ( MyPojo ) o;
return someField.equals( myPojo.someField );
}
}
то, припускаючи, що ви знаєте, яке значення someField
буде, ви можете знущатися над цим так.
when(fooDao.getBar(new MyPojo(expectedSomeField))).thenReturn(myFoo);
плюси: Це більш чітко, ніж відповіді any
. Як рецензент коду, я пильную відкритість для any
написання коду молодшим розробникам, коли він переглядає логіку їх коду для створення відповідного об'єкта, що передається.
con: Іноді поле, яке передається об'єкту, є випадковим ідентифікатором. У цьому випадку ви не можете легко побудувати очікуваний об’єкт аргументу у вашому макетному коді.
Інший можливий підхід - використовувати Answer
об’єкт Mockito, який можна використовувати разом із when
методом. Answer
дозволяє перехоплювати фактичний виклик та перевіряти вхідний аргумент та повертати макетний об’єкт. У наведеному нижче прикладі я використовую, any
щоб знайти будь-який запит щодо методу, що висміюється. Але тоді в Answer
лямбді я можу далі перевірити аргумент Базо ... можливо, щоб переконатися, що йому передано належний ідентифікатор. Я вважаю за краще це над any
собою, щоб хоча б деяка перевірка була проведена на аргументі.
Bar mockBar = //generate mock Bar.
when(fooDao.getBar(any(Bazo.class))
.thenAnswer( ( InvocationOnMock invocationOnMock) -> {
Bazo actualBazo = invocationOnMock.getArgument( 0 );
//inspect the actualBazo here and thrw exception if it does not meet your testing requirements.
return mockBar;
} );
Отже, підсумовуючи все, мені подобається покладатися на equals
(де очікуваний аргумент та фактичний аргумент повинні бути рівними один одному), і якщо рівне неможливо (через неможливість передбачити фактичний стан аргументу), я вдаюся щоб Answer
оглянути аргумент.