Есть ли способ иметь что-то вроде аргумента сообщения jUnit Assert в методе проверки Mockito? - PullRequest
21 голосов
/ 15 ноября 2010

Давайте предположим фрагмент кода тестирования:

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());

Ответы [ 4 ]

18 голосов
/ 02 июля 2012

Это делает трюк (простой и понятный):

try {
 verify(myMockedObject, times(1)).doSomthing();
} catch (MockitoAssertionError e) {
    throw new MockitoAssertionError("Was expecting a call to myMockedObject.doSomthing but got "+ e.getMessage());
}
6 голосов
/ 27 ноября 2010

Вы не можете делать в мокито.Синтаксис Mockito позволяет очень легко тестировать ожидаемое поведение, но он не имеет понятия состояния теста.

То, что вы пытаетесь сделать, - это иметь некоторую информацию, которой нет в макетируемом объекте, когда макеты не соответствуют ожиданиям.

Если вы действительно хотите это сделать, я вижу два основных способа: либо вы создаете свой собственный режим проверки, реализующий интерфейс

org.mockito.verification;
public static interface VerificationMode

, и добавляете метод, подобный atLeastOnceMsd (String msg), который будет показыватьсообщение в случае сбоя или добавления текущего протестированного метода в модели в объект просмотра

, например, с аналогичной строкой во внутреннем цикле.

  view.setName("now we are testing " + method.getName());
3 голосов
/ 15 ноября 2010

Нет прямого вызова 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());
}
1 голос
/ 27 ноября 2010

Вы можете создать средство сопоставления для печати информации о текущем методе.Это будет немного неуклюже, но будет работать, печатая имя метода, когда проверка не удалась.

...