Ответ 1
Это трюк (простой и понятный):
try {
verify(myMockedObject, times(1)).doSomthing();
} catch (MockitoAssertionError e) {
throw new MockitoAssertionError("Was expecting a call to myMockedObject.doSomthing but got "+ e.getMessage());
}
Предположим, что фрагмент кода тестирования:
Observable model = Class.forName(fullyQualifiedMethodName).newInstance();
Observer view = Mockito.mock(Observer.class);
model.addObserver(view);
for (Method method : Class.forName(fullyQualifiedMethodName).getDeclaredMethods())
{
method.invoke(model, composeParams(method));
model.notifyObservers();
Mockito.verify(
view, Mockito.atLeastOnce()
).update(Mockito.<Observable>any(), Mockito.<Object>any());
}
Mockito.verify
метод генерирует исключение, если метод в модели не вызвал метод Observable.setChanged()
.
Проблема: без добавления loggers/System.print.out
Я не могу понять, что текущий метод, который не прошел тест. Есть ли способ иметь что-то похожее на методы jUnit Assert
:
Assert.assertEquals(
String.format("instances %s, %s should be equal", inst1, inst2),
inst1.getParam(),
inst2.getParam()
);
РЕШЕНИЕ:
verify(observer, new VerificationMode()
{
@Override
public void verify(VerificationData data)
{
assertTrue(
format(
"method %s doesn't call Observable#setChanged() after changing the state of the model",
method.toString()
),
data.getAllInvocations().size() > 0);
}
}).update(Mockito.<Observable>any(), Mockito.<Object>any());
Это трюк (простой и понятный):
try {
verify(myMockedObject, times(1)).doSomthing();
} catch (MockitoAssertionError e) {
throw new MockitoAssertionError("Was expecting a call to myMockedObject.doSomthing but got "+ e.getMessage());
}
Вы не можете делать это в mockito. Синтаксис Mockito позволяет очень легко тестировать ожидаемое поведение, но не имеет понятия состояния теста.
То, что вы пытаетесь сделать, - это получить некоторую информацию, которая не находится в издеваемом объекте, когда mocks не оправдывает ожиданий.
Если вы действительно хотите это сделать, я вижу два общих способа: либо вы создаете свой собственный метод verifyMode, реализующий интерфейс
org.mockito.verification;
public static interface VerificationMode
и добавление метода, такого как atLeastOnceMsd (String msg), который покажет сообщение в случае сбоя или добавления текущего тестируемого метода в модели к объекту представления
например, с аналогичной линией во внутреннем цикле.
view.setName("now we are testing " + method.getName());
Существует не прямой вызов API, который позволяет проверять сообщение. Но я думаю, что если вы измените свою подпись подписи для использования объекта метода, а не Mockito.any(), то toString() в классе Method начнет работать и даст вам то, что вы хотите.
Что-то вроде этого.
import static org.mockito.Matchers.anyObject;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.verify;
import static org.mockito.Matchers.eq;
...
Observable model = Class.forName("class name").newInstance();
verify(view, times(1)).update(eq(model), anyObject());
for (Method method : Class.forName("class name").getDeclaredMethods())
{
method.invoke(model, composeParams(method));
model.notifyObservers();
verify(view, atLeastOnce()).update(eq(method), anyObject());
}
Вы можете создать совпадение для печати информации о текущем методе. Это будет немного неуклюже, но он будет работать, напечатав имя метода, когда проверка завершится с ошибкой.
Существует org.mockito.internal.verification.Description
, который делегирует предоставленный VerificationMode
, но позволяет переопределить сообщение проверки.