Другой вариант - положиться на старый добрый equals
метод моды . Пока аргумент в when
mock 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
проверить аргумент.