2015-10-23 2 views
1

Для некоторых интеграционных тестов мы используем Spring @ContextConfiguration для создания реального контекста Spring во время теста. Теперь, это не должно быть полным тестом интеграции, поэтому нам нужна целая куча весенних бобы как издевательства. Это не слишком сложно, используя заводские методы Mockito и Spring, и еще проще с Springockito.Inject JMockit извиняется в контексте Spring

Но, это используется Mockito, а мы просто переходим на JMockit. Я бы тоже предпочел использовать JMockit здесь. В принципе, я ищу замену Springckito, которая вместо этого использует JMockit.

Я также могу это сделать вручную. Тем не менее, Mockito и JMockit кажутся разными в одном очень важном ключе: во время Mockito вы создаете мошки, настоятельно используя вызов метода, в JMockit вы получаете декларативно «впрыскивание» в ваш тест. Слишком поздно заполнять контекст Spring. Поэтому, если кто-то может ответить на это, я тоже счастлив: как вы можете создать макет в JMockit в своем коде?

ответ

0

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

@Configuration 
@Profile("!test") 
public class MyConfig { 
    @Bean 
    public MyBean bean() { 
     /** Real bean **/ 
    } 
} 

с издеваться один

@Configuration 
@Profile("test") 
public class MyTestConfig { 
    @Bean 
    public MyBean bean() { 
     final MyBean bean = mock(MyBean.class); 
     when(bean.doSomething()).thenReturn(withReply()); 
     return bean; 
    } 
} 

он работает с «реальным» Spring Integration Test контекстом и Mockito, он должен работать с JMockit, а также, до тех пор, как вы можете создать свой боб с версией JMockit вашего класса: в основном что-то эквивалентное mock (MyBean.class).

Edit: В то время как я не знаком с JMockit, кажется, что эквивалентный способ может быть

@Configuration 
@Profile("test") 
public class MyTestConfig { 

    @Injectable MyBean mockXyz; 

    @Bean 
    public MyBean bean() { 
     /** You can probably mock its behaviour **/ 
     return mockXyz; 
    } 
} 
+0

Для меня кажется, что на самом деле нет эквивалента для 'mock (MyBean.class)' в JMockit. –

+0

Только что отредактировал мой ответ с дальнейшими мыслями. – medveshonok117

+0

Несмотря на то, что тестовый класс может быть собственным классом конфигурации в тесте Spring (который выглядит ошеломляющим), в этот момент JMockit еще не вошел. Другими словами, аннотация «@ Injectable» еще не была любой эффект, 'mockXyz' является' null'. –

0

Если вы используете Spring тест, чтобы сделать все инъекции, то вы можете просто позволить ей сделать работу создания экземпляров для всех зависимостей, при этом они издеваются над подходящими макетными полями/параметрами, объявленными аннотациями @Mocked или @Capturing. Последний будет издеваться над любым классом реализации, который Spring выбрал для создания экземпляра, даже если тип, используемый в объявлении mock, является интерфейсом или базовым классом.

В качестве альтернативы вы можете просто позволить JMockit самостоятельно разрешать все зависимости, используя @Tested(fullyInitialized = true) для тестируемых объектов верхнего уровня, с издеваемыми зависимостями, представленными как @Injectable.

+0

Это не работает. Spring создает контекст _before_ JMockit запускает и перезаписывает конструкторы. –

+0

Что касается использования 'fullInitialized' - это, безусловно, правильная вещь, когда все, что вы хотите от Spring, это DI, но в моем тесте мне нужна настройка веб-приложения для тестирования MCV-контроллеров. –

+0

Почему это имеет значение, если Spring создает бобы, прежде чем их издеваются? Выполняют ли они какой-то код, который не работает или что-то еще? –

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