SpringJUnit4ClassRunner没有在java配置中看到我在上下文中定义的内容

时间:2017-12-01 01:07:49

标签: java spring-mvc spring-security

我正在尝试测试我的弹簧安全表单。我的项目中有一个完整的注释配置(请看下面的内容)。现在我试图通过 SpringJUnit4ClassRunner 设置一个测试用例并检查其中的一些条件。我无法做到,因为 @ContextConfiguration 注释没有看到我的上下文配置。我使用 AbstractAnnotationConfigDispatcherServletInitializer 来配置我的项目。另请参阅下面的代码。

这是测试类:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = WebInit.class)
public class test {

    @Autowired
    private WebApplicationContext context;
    private MockMvc mockMvc;

    @Before
    public void setup() {
        mockMvc = MockMvcBuilders
                .webAppContextSetup(context)
                .apply(springSecurity())
                .build();
    }

    @Test
    public void someTest() throws Exception {
        mockMvc.perform(post("/").with(csrf().asHeader()).with(user("testuser").roles("USER")));
    }
}

这是配置类:

@Configuration
public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer {

    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{RootConfig.class, SecurityConfig.class};
    }

    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{WebConfig.class};
    }

    protected String[] getServletMappings() {

        return new String[]{"/"};
    }


}

我还附上错误日志

  

SEVERE:允许TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@4157f54e]准备测试实例时遇到异常[securityTests.test@7fa98a66]   org.springframework.beans.factory.BeanCreationException:创建名称为&#39; securityTests.test&#39;的注册自动连接依赖项失败;嵌套异常是org.springframework.beans.factory.BeanCreationException:无法自动装配字段:private org.springframework.web.context.WebApplicationContext securityTests.test.context;嵌套异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:没有为依赖项找到类型[org.springframework.web.context.WebApplicationContext]的限定bean:期望至少有一个bean可以作为此依赖项的autowire候选者。依赖注释:{@ org.springframework.beans.factory.annotation.Autowired(required = true)}

我的所有spring依赖项在pom.xml中都有相同的版本(spring 4.2.3.RELEASE)。我不想创建.xml文件,它将为我配置上下文。我希望所有这些都在java配置中完成。我该怎么做? 提前感谢您的帮助

2 个答案:

答案 0 :(得分:0)

添加@WebAppConfiguration,以便WebApplicationContext可用。

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = WebInit.class)
public class test {

    @Autowired
    private WebApplicationContext context;
    private MockMvc mockMvc;

    @Before
    public void setup() {
        mockMvc = MockMvcBuilders
                .webAppContextSetup(context)
                .apply(springSecurity())
                .build();
    }

    @Test
    public void someTest() throws Exception {
        mockMvc.perform(post("/").with(csrf().asHeader()).with(user("testuser").roles("USER")));
    }
}

答案 1 :(得分:0)

我实际上自己解决了我的问题。 事实证明,在我的pom.xml文件中,我依赖于spring数据2.0.1.RELEASE,它在某种程度上打断了测试的正确运行。最可能的原因是spring数据2.0.1从我添加到pom.xml的其他spring组件中提取了一些类,但是我的版本是4.2.1.RELEASE,而弹簧数据提取的那些是5.0.0.RELEASE。所以覆盖发生了。无论如何,从pom.xml删除spring数据依赖后,一切都很顺利。 谢谢你的回答