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 для рассмотрения.

Другие вопросы по тегам