2016-01-27 3 views
0

Я хочу создать тесты, работающие с контекстом Spring, с издеваемыми репозиториальными компонентами. Я использую Spring Boot 1.3.2.BUILD-SNAPSHOT + JUnit + Mockito.Mock Beans from Spring Context

Вот мой тест конфигурации класс:

@ComponentScan(basePackages = "myapp", excludeFilters = 
@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, 
     value = { 
       OfferRepository.class 
     } 
) 
) 
@Configuration 
public class TestEdge2EdgeConfiguration { 

    @Bean 
    public OfferRepository offerRepository() { 
     return mock(OfferRepository.class); 
    } 

} 

Цель этой конфигурации исключить OfferRepository из Спринг контекста и высмеивать его, спасибо этому я буду иметь возможность писать тесты, которые используют Spring контекст с издевательский репозиторий базы данных.

Вот мой тестовый класс:

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = {TestEdge2EdgeConfiguration.class}) 
@WebAppConfiguration 
public class OfferActionsControllerTest { 

    @Autowired 
    private OfferRepository offerRepository; 

    @Autowired 
    private OfferActionsController offerActionsController; 

    @Before 
    public void setUp(){ 
     MockitoAnnotations.initMocks(this); 
    } 

    @Test 
    public void saveOffer() { 
     //given 
     BDDMockito.given(offerRepository.save(any(Offer.class))).willReturn(new Offer()); 
     //when 
     ResponseEntity<Offer> save = offerActionsController.save(new Offer()); 

     //then 
     org.springframework.util.Assert.notNull(save); 
    } 
} 

Test и тестовая конфигурация каталог:

src/test/java/myapp 

Моя конфигурация приложения и пакеты, содержащие OfferRepository каталог является:

src/main/java/myapp/ 

Проблема что Spring Boot не загружает мою конфигурацию из TestEdge2EdgeConf iguration.class и mock для OfferRepository никогда не создается.

Может ли любой орган помочь мне с этим, пожалуйста?

+0

Вы пытались с @ContextConfiguration (TestEdge2EdgeConfiguration.class)? – wsl

+0

SpringApplicationConfiguration похожа на стандартную @ContextConfiguration, но использует SpringApplicationContextLoader Spring Boot – zaqpiotr

+0

Мне не было известно об аннотации ComponentScan $ Filter, но после чтения документов и, если я правильно ее понимаю, зачем это нужно в этом случае? Работает ли он без фильтра? –

ответ

0

Это, как вы должны делать это (при условии, что вы пишете тест для offerActionsController и инъекционных offerRepository):

@Mock 
private OfferRepository offerRepository; 

@InjectMocks 
private OfferActionsController offerActionsController; 

@Before 
public void setUp(){ 
    MockitoAnnotations.initMocks(this); 
} 

Вы можете написать свой метод испытания следующим образом:

@Test 
public void saveOffer() { 
    /* Given */ 
    Mockito.when(offerRepository.save(Mockito.any(Offer.class))).thenReturn(new Offer()); 

    //when 
    ResponseEntity<Offer> save = offerActionsController.save(new Offer()); 

    //then 
    org.springframework.util.Assert.notNull(save); 
} 
+0

Это нормально, если я хочу написать модульные тесты и Вы правы, но я хочу написать интеграционные тесты с издетой базой данных, поэтому мне нужен весенний контекст для моего мазохиста и издеваться над репозиториями. – zaqpiotr

+0

Создайте сеттер для 'offerRepository' в своем классе, а затем передайте свой издеваемый объект в сеттер из вашего тестового класса. – user2004685

+0

У меня есть более глубокая структура там под капотом. Контроллер -> Сервис -> Репозиторий. Так что мне нужен Spring Context up и mock Repository – zaqpiotr

0

Использование Spingockito, чтобы заменить фасоль, используя @ReplaceWithMock. Не забудьте использовать @Autowired с @ReplaceWithMock, если вам нужен доступ к издеваемому компоненту в тесте.

+0

Спасибо за совет, я пытался это сделать, но шпионы Spingockito не работают с SpringBoot. Ehh, я могу найти решение для этого, но я думаю, что @SpringBootApplication делает невозможным издеваться над фасолью в контексте Spring. – zaqpiotr