2012-02-07 2 views
1

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

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

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

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

ответ

5

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

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

public class someBean implements Serializable { 
    private ApplicationBean applicationBean 

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

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

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

+0

Согласен, но я уже пробовал этот подход, и инъекция не работала. Связанный вопрос/ответ основан на ссылке на шов. Я попробую еще раз ваше предложение, может быть, мне не хватает небольшого материала :) – dcernahoschi

+0

Как это могло бы не работать: 'ApplicationBean mockApplicationBean = mock (ApplicationBean.class); SomeBean someBean = new SomeBean(); someBean.setApplicationBean (mockApplicationBean); 'Это обычная старая Java. Если это не сработает, у установщика есть ошибка. С этим подходом шов вообще не используется. –

+0

Кажется, что это работает, никаких исключений, но он использует обычный класс, а не макет. – dcernahoschi

1

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

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

Редактировать: кровавые опечатки.

Смежные вопросы