ActiveWeb: насмешливый внедренный сервис
При имитации службы, внедренной в контроллер, метод службы должен возвращать смоделированный объект, что-то вроде этого:
public class EmptyInterventionServiceMock implements InterventionService {
@Override
public Intervention findByInvoiceNumber(String invoiceNumber, String language) {
return mockedIntervention(invoiceNumber, language);
}
protected Intervention mockedIntervention(String invoiceNumber, String language) {
return mock(Intervention.class);
}
}
Можно ли смоделировать некоторые значения, которые будут возвращены вышеупомянутым смоделированным объектом (Intervention
) чтобы проверить фи они должны присутствовать в сгенерированном шаблоне JSON?
Например, в зависимости от того, Intervention
имеет spare parts
, services
, states
(все они являются просто коллекциями других объектов) и т. д. Если это так, JSON должен содержать соответствующие ключи: services: [{....}]
, states: [{}]
, так далее.
Было бы неплохо получить макет объекта в тесте и заглушить его возвращаемые значения. Единственный способ добиться этого на данный момент - создать отдельный Mock
класс обслуживания и внедрить его в тестовый класс следующим образом:
public class InterventionsControllerSpec extends ControllerSpec {
@Before
public void before() {
Injector injector = injector().bind(InterventionService.class).to(BaseInterventionServiceMock.class).create();
}
куда BaseInterventionServiceMock
просто расширяется EmptyInterventionServiceMock
и заглушки некоторые методы возвращают значения, переопределяя его mockedIntervention
метод:
public class BaseInterventionServiceMock extends EmptyInterventionServiceMock {
@Override
protected Intervention mockedIntervention(String invoiceNumber, String language) {
Intervention intervention = mock(Intervention.class);
when(intervention.getString("ITV_DOCUMENT_NUMBER")).thenReturn("123");
when(intervention.getString("ITV_INVOICE")).thenReturn(invoiceNumber);
...
etc.
Поскольку это далеко от идеала, мне интересно, есть ли более сухой способ сделать это?
Спасибо.
1 ответ
Вы ничего не пропускаете. Ваши предположения верны. Создание фиктивного подкласса сервиса - это то, как мы проводим тестирование. Если вы хотите более элегантный способ, вы можете отправить предложение на рассмотрение: https://github.com/javalite/activeweb/issues для рассмотрения.