Условная проверка Мокито с заводами - PullRequest
2 голосов
/ 09 декабря 2010

Возможно ли в mockito проверить, был ли вызван метод для макета, основываясь на том, действительно ли макет использовался в тестируемом модуле?

В качестве простого примера я поставляю фиктивную фабрику (FooFactory) для моего тестируемого модуля, и когда вызывается Foo.create (), он возвращает макет (Foo), который будет использоваться определенными методами в модуле. -под-тест. Как я могу проверить, что Foo.method () вызывается, только если Foo.create () был вызван тестируемым модулем?

Я предполагаю, что код будет выглядеть примерно так:

@Before
public void init() {
  Foo mockFoo = mock(Foo.class);
  when(fooFactory.create()).thenReturn(mockFoo);
  test = new UnitUnderTest(fooFactory);
}

@Test
... may or may not create a foo ...

@After
public void cleanup() {
  if (verify(fooFactory).create()) {  // Here's the 'conditional verification'
    Foo mockFoo = fooFactory.create();
    verify(mockFoo).close();
  }
}

Для более конкретного примера моя фабрика возвращает объект Reader, который я хочу гарантировать, что он закрыт, но не каждый метод в классе фактически создает Reader. Очевидно, я мог бы добавить проверку к каждому тесту, где я знаю, что необходим Reader, но это, похоже, требует много усилий.

Ответы [ 2 ]

1 голос
/ 10 декабря 2010

Вы уверены, что хотите написать этот тест?

Я вижу два решения:

1) Вы действительно хотите убедиться, что ресурс создан и закрыт, поэтому попробуйтенаписать тест, в котором вы можете проверить оба вызова метода.

2) Вы хотите убедиться, что всякий раз, когда ресурс открыт, он также закрывается.Это может быть реализовано как утверждение в производственном коде ...

Если вы действительно хотите продолжить свой подход, вы можете поймать исключение, которое выдает первая проверка, если метод create () не имеетбыл вызван.В улове вы только что вернулись.

Кроме того, вы не должны выполнять проверку в процессе очистки, а в реальном методе тестирования.

0 голосов
/ 10 декабря 2010

Честно говоря, ваш тест слишком сложен.Мой опыт многих проектов и большого количества модульных тестирований показал, что лучший способ справиться с ситуацией - убедиться, что каждый тест тестирует только одну вещь.Вы можете иметь столько утверждений, сколько захотите, но это должен быть один вызываемый метод и один протестированный сценарий.Что-нибудь мо и тест становится слишком сложным.Кроме того, другим разработчикам очень трудно выбрать тест на более поздней стадии при дальнейшей разработке приложения.

Поэтому я бы предложил разбить ваш тест на несколько тестов, по одному на сценарий, а затем посмотреть,тебе все еще нужно это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...