@WebAppConfiguration没有注入(@WebAppConfiguration not

2019-08-31 16:41发布

我想创建使用Spring 3.2.1弹簧MVC测试。 继一些教程,我认为这将是直接的。

下面是我的测试:

@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将迫使春天注入它。 但是,当我从Eclipse运行这个测试,我得到:

org.springframework.beans.factory.NoSuchBeanDefinitionException:通过引起[org.springframework.web.context.WebApplicationContext]找到依赖性否类型的排位豆:预期至少1种豆,其有资格作为自动装配候选这种依赖性。 依赖注解:{@ 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。注(AutowiredAnnotationBeanPostProcessor.java:486)

更新 -我不得不改变我的测试Java配置类

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

然而,现在的问题是,我可以叫我的REST服务,但它是调用一些其他的服务,包括数据库调用。 什么是只是测试呼叫和嘲笑响应的首选方式。 我想测试有效和无效的条件。

Answer 1:

在我的情况的问题已经解决了通过更换:

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

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

请注意,在装载机类名的网站 。 与以往的加载器, GenericApplicationContext已经注入尽管@WebAppConfiguration注解。



Answer 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将加载用于使用默认路径到web应用程序的根的试验。 因此,您可以自动装配WebApplicationContext中,并用它来建立mockMvc。

需要注意的是@WebAppConfiguration必须配合使用测试类中@ContextConfiguration。



Answer 3:

你为什么不加入这个注解,看看它是否工作。 与豆XML映射替换XXXX-text.xml。

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


Answer 4:

其中一个测试的是可与注释头,在那里我有类似的问题,从问题的本地开发的支持。

该意见是本次测试的早期版本。

@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 {/* */}


文章来源: @WebAppConfiguration not injected