@WebAppConfiguration не вводится

Я пытаюсь создать тесты spring -mvc, используя Spring 3.2.1. После некоторых уроков я подумал, что это будет прямолинейно.

Вот мой тест:

@RunWith( SpringJUnit4ClassRunner.class )
@ContextConfiguration( loader = AnnotationConfigContextLoader.class, classes = { JpaTestConfig.class } )

@WebAppConfiguration
public class HomeControllerTest {

@Resource
private WebApplicationContext webApplicationContext;

private MockMvc mockMvc;

@Test
public void testRoot() throws Exception {
    mockMvc.perform(get("/").accept(MediaType.TEXT_PLAIN)).andDo(print())
            // print the request/response in the console
            .andExpect(status().isOk()).andExpect(content().contentType(MediaType.TEXT_PLAIN))
            .andExpect(content().string("Hello World!"));
}

@Before
public void setUp() {
    mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}
}

Вот мой соответствующий pom.xml:

<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest-all</artifactId>
    <version>1.3</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.10</version>
    <scope>test</scope>
<exclusions>
    <exclusion>
        <artifactId>hamcrest-core</artifactId>
        <groupId>org.hamcrest</groupId>
    </exclusion>
</exclusions>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>3.2.1.RELEASE</version>
</dependency>

У меня есть следующий класс тестовой конфигурации:

@Configuration
@EnableTransactionManagement
@ComponentScan( basePackages = { "com.myproject.service", "com.myproject.utility",
        "com.myproject.controller" } )
@ImportResource( "classpath:applicationContext.xml" )
public class JpaTestConfig {
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() {
...
}

// various other services/datasource but not controllers
}

Я понимаю, что добавление @WebAppConfiguration заставит Spring ввести его. Но когда я запускаю этот тест из Eclipse, я получаю:

Вызвано: org.springframework.beans.factory.NoSuchBeanDefinitionException: Нет квалификационный bean типа [org.springframework.web.context.WebApplicationContext] найдено для зависимость: ожидается как минимум 1 bean, которая квалифицируется как autowire кандидат на эту зависимость. Аннотации зависимостей: {@Org.springframework.beans.factory.annotation.Autowired(обязательно = истина)}   в org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:967)   в org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:837)   в org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:749)   в org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:486)

Обновить - мне пришлось изменить класс конфигурации тестовой Java

@Configuration
@EnableWebMvc
@ComponentScan( basePackages = { "...." } )
@EnableTransactionManagement
@ImportResource( "classpath:applicationContext.xml" )
public class JpaTestConfig extends WebMvcConfigurationSupport {

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

Ответ 1

В моем случае проблема решена путем замены:

@ContextConfiguration(loader = AnnotationConfigContextLoader.class, classes = { ... })

с

@ContextConfiguration(loader = AnnotationConfigWebContextLoader.class, classes = { ... })

Обратите внимание на Веб в имени класса загрузчика. При использовании предыдущего загрузчика GenericApplicationContext был введен, несмотря на аннотацию @WebAppConfiguration.

Ответ 2

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

@WebAppConfiguration
@ContextConfiguration(classes = TestApplicationContext.class)
public class MyClassTest {

    private MockMvc mockMvc;

    @Autowired
    private WebApplicationContext wac;

    @Before
    public void setUp() {
        mockMvc = webAppContextSetup(wac).build();
    }
    ....       
}

@Configuration
public class TestApplicationContext {

    @Bean
    public MyBean myBeanId(){
        return Mockito.mock(MyBean.class);
    }
    ....
}

Простое присутствие @WebAppConfiguration в тестовом классе гарантирует, что WebApplicationContext будет загружен для теста с использованием пути по умолчанию к корню веб-приложения. Поэтому вы можете autwire WebApplicationContext и использовать его для настройки mockMvc.

Обратите внимание, что @WebAppConfiguration необходимо использовать в сочетании с @ContextConfiguration в тестовом классе.

Ответ 3

Почему бы вам не добавить эту аннотацию и посмотреть, работает ли она. Замените XXXX-text.xml вашим bean отображением xml.

@ContextConfiguration(locations={"classpath:/XXXX-test.xml"})

Ответ 4

Один из тестов доступен для локальной поддержки dev с заголовками аннотаций, где у меня возникла похожая проблема из вопроса.

Комментарии являются предыдущей версией этого теста.

@RunWith(SpringJUnit4ClassRunner.class)
/* @EnableJpaAuditing */ /* for jpa dates */ /* it should be defined only once, 
because 'jpaAuditingHandler' defined in null on application startup */
@EntityScan(basePackageClasses = { EnableJpaAuditing.class, Jsr310JpaConverters.class })
//@ProfileValueSourceConfiguration(Application.class)
//@ContextConfiguration(loader = AnnotationConfigContextLoader.class)
@ContextConfiguration(loader = AnnotationConfigWebContextLoader.class)
//@PropertySource("classpath:application.properties")
@TestPropertySource(locations = "classpath:application.properties")
//@WebAppConfiguration
@SpringBootTest
public class JpaTests {/* */}