Макет объекта и весенние аннотации - PullRequest
4 голосов
/ 28 октября 2009

Я использую аннотации Spring в своем коде для создания DI. Допустим, у меня есть класс class1, который зависит от другого класса class2, я определяю class1, как показано ниже:

@Component
public class class1 {

@Resource
private interface2 object2;

}

class2 - это реализация interface2.

Теперь давайте скажем, что я хочу смоделировать class2 и передать его в class1, я не вижу никакого конструктора или сеттера в class1. Я думаю, что Spring использует отражение, чтобы внедрить object2. Как я могу издеваться над этим? Должен ли я добавить сеттер в class1? Или я могу использовать то же самое, что и Spring - я имею в виду, что у Spring есть фреймворк для фиктивных объектов или что-то подобное, я планировал использовать EasyMock для насмешки.

Спасибо

Ответы [ 6 ]

6 голосов
/ 28 октября 2009

Класс ReflectionTestUtils в Spring может быть полезным.
Кажется, он делает то, что вы ищете ... хотя бы часть впрыска: -)

3 голосов
/ 29 ноября 2012

Mockito обладает действительно мощным способом обработки макетов и DI:

@RunWith(MockitoJUnitRunner.class)
public class Class1Test {
    @Mock
    private Interface2 inteface2mock;

    @InjectMocks
    private Class1 class1;

    @Test
    public void someTest() {
        when(interface2mock.doSomething("arg")).thenReturn("result");

        String actual = class1.doSomeThatDelegatesToInterface2();

        assertEquals("result", actual);
    }
}

Узнайте больше о @ InjectMocks в javadoc Mockito или в сообщении в блоге , которое я писал об этой теме некоторое время назад.

Доступно в версии Mockito 1.8.3, улучшено в 1.9.0.

1 голос
/ 28 октября 2009

ReflectionTestUtils - самый простой способ добавить макет, который вы хотите (мы используем JMock, но это не имеет большого значения), недостатком является то, что он немного хрупкий. Если вы переименуете поле, вы также должны помнить о необходимости изменить тест.

Вы также можете использовать это: http://i -proving.com / 2006/11/09 / using-jmock-and-inject-object /

Описывает, как использовать макет объекта в контексте пружины.

0 голосов
/ 10 июня 2013

Существует правило JUnit, которое предоставляет EasyMock аналогичные возможности инъекции, основанные на аннотациях, в стиле Mockito.См. EasyMockRule

0 голосов
/ 28 октября 2009

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

Сделать это самому себе так:

    for (Field field : injectable.getClass().getDeclaredFields()) {
        MyAnnotation annotation = field.getAnnotation(MyAnnotation.class);
        if (annotation != null) {
            field.setAccessible(true);
            Object param = generateMockObject();
            field.set(injectable, param);
        }
    }
0 голосов
/ 28 октября 2009

AFAIK, в Spring нет встроенной среды для насмешек, поэтому вам нужно использовать что-то вроде EasyMock. То, как я делал это в прошлом, это

  • Определение конфигурации Spring с использованием XML вместо аннотаций *
  • Конфигурация для основного приложения определена в appContext-main.xml, а тестовая конфигурация (фиктивные объекты) определена в appContext-test.xml
  • У ложного компонента в appContext-test.xml должен быть тот же идентификатор, что и у соответствующего компонента в appContext-main.xml
  • Когда приложение работает только * Загружается appContext-main.xml
  • При выполнении тестов загружаются и appContext-main.xml, и appContext-test.xml. Убедитесь, что они загружены в таком порядке, чтобы макеты «переопределяли» любые бины с одинаковыми именами

* Вам не нужно преобразовывать все вашу конфигурацию Spring в XML, чтобы использовать этот подход. Только те компоненты, которые имеют ложные реализации или имитированные реализации, внедренные в них, должны быть изменены. Остальные bean-компоненты могут продолжать определяться аннотациями.

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