Дразнить во время компиляции - PullRequest
2 голосов
/ 07 февраля 2012

Я работаю с устаревшим кодом, и мне нужно проверить, называется ли какая-то дорогая служба (она выполняет сетевые вызовы, отправляет электронные письма и т. Д.).

Я могу внедрить поддельный сервис вместо оригинального с помощью используемого фреймворка (jboss seam 2). Смотрите этот вопрос: Mock @ org.jboss.seam.annotations.in поведение для unittest

Теперь я хочу, чтобы мой поддельный объект был более умным, чтобы утверждать, был ли он вызван или нет, и т. Д. Я хотел бы, чтобы это был Mockito, Easymock или какая-то другая вещь. Но построение макета классическим способом в тесте с последующим введением его не работает из-за того, как шов 2 и тест шва имеют дело с инъекцией. Смотрите ссылку выше.

Вопрос: есть ли способ, чтобы мой макет расширился или был аннотирован, чтобы стать мокито или чем-то другим? Как я могу получить ссылку на него в моих тестах?

Ответы [ 2 ]

6 голосов
/ 08 февраля 2012

Я не согласен с ответом на вопрос, с которым вы связаны.Модульное тестирование должно проверять класс независимо от среды, в которой он должен работать. И структуры внедрения зависимостей точно используются, чтобы иметь возможность внедрять фиктивные зависимости в модульных тестах, не требуя какой-либо сложной среды для запуска модульного теста.

Я не знаю Seam, но в его документации сказано, что @In может быть помещен в метод доступа к свойству.Я бы просто протестировал класс следующим образом:

public class someBean implements Serializable {
    private ApplicationBean applicationBean

    @In
    protected void setApplicationBean(ApplicationBean applicationBean) {
        this.applicationBean = applicationBean;
    }
    ...
}

И я бы просто позвонил установщику, чтобы ввести макет в модульный тест.

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

2 голосов
/ 08 февраля 2012

Вам нужен класс с тем же именем, но более высоким приоритетом.Я сделал много издевательств, просто делая это.

Вы даете одно и то же @name для своего ложного класса и определяете @install (приоритет = MOCK).Как только этот класс будет в пути к классам, он будет использоваться вместо вашего обычного класса (по умолчанию приоритет - приложение, если я правильно помню).У меня сейчас нет готового кода, но я смоделирую, например, FacesMessage, чтобы во время тестирования я мог прочитать эти сообщения из этого класса и проверить их.

...