如何使用自定义WebApplicationInitializer运行测试?

时间:2014-06-12 01:04:27

标签: spring scala spring-mvc spring-test

class MyWebAppInitializer extends WebApplicationInitializer {
  def onStartup(servletContext: ServletContext): Unit = {
      ...
  }
}

@RunWith(classOf[SpringJUnit4ClassRunner])
@WebAppConfiguration
@ContextConfiguration(classes = Array(classOf[MyConfig]),
    initializers=Array(classOf[MyWebAppInitializer]))     // <<< ERROR
class MyTest {
  ...
}

抱怨:

annotation argument needs to be a constant; found: classOf[MyWebAppInitializer] 

更新:@M。 Deinum指出这里只允许ApplicationContextInitializers - 所以错误是一个报告错误的类型错误匹配。

那么......我怎样才能按顺序使用自己的MyWebAppInitializer并测试其中定义的功能?

2 个答案:

答案 0 :(得分:8)

在您的上下文配置中,我没有看到您列出了上下文加载器。 AnnotationConfigWebContextLoader将在您的类路径上找到WebApplicationInitializer的实例,方法是添加这个实例并删除初始化器(正如您所指出的那样,对于ApplicationContextInitializers而不是WebApplicationInitializers),那么您应该全部设置。

@RunWith(classOf[SpringJUnit4ClassRunner])
@WebAppConfiguration
@ContextConfiguration(classes = {ConfigClass.class, AnotherConfigClass.class}, loader=AnnotationConfigWebContextLoader.class))
class MyTest {
...

这是一个工作示例

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes={WebConfiguration.class, SecurityConfig.class}, loader=AnnotationConfigWebContextLoader.class)
@ActiveProfiles("dev")
public class AppTests {
    private MockMvc mockMvc;

    @Autowired
    protected WebApplicationContext webApplicationContext;

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

    @Test
    public void simple() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.get("/"))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.view().name("index"));
    }
}

答案 1 :(得分:2)

答案是“抱歉,你不能”。 你可以参考这个: Spring FrameworkSPR-10199 Add capability to use WebApplicationInitializer for testing Spring web applications

正如Sam Brannen所说:

  

尽管Spring确实为Servlet API提供了模拟,但Spring确实如此   不要模拟Servlet容器,目前无意。弹簧   一直专注于容器集成测试。充分   因此,模拟容器超出了Spring的测试范围   支持。请参阅以上Rossen和我的评论   的信息。