Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to run tests using a custom WebApplicationInitializer?

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 {
  ...
}

Complains about :

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

UPDATE: @M. Deinum points out that only ApplicationContextInitializers are allowed here - so the error is a badly reported type mistmatch.

So... how can I use my own MyWebAppInitializer in order and test the functionality defined therein?

like image 462
user48956 Avatar asked Jun 12 '14 01:06

user48956


People also ask

How do you test WebApplicationInitializer?

The WebApplicationInitializer is for bootstrapping your application it works in conjunction with a ServletContainerInitializer . If you want to test it then simply test it. Create an instance, pass an instance of MockServletContext to the startup method and see if it does what you expect it does.

How WebApplicationInitializer works?

An implementation of the WebApplicationInitializer interface configures the ServletContext programmatically. In particular, it allows for the creation, configuration, and registration of the DispatcherServlet programmatically. Thereby allowing the web. xml file to be removed from modern Spring MVC applications.


2 Answers

In your context configuration I don't see that you have a context loader listed. The AnnotationConfigWebContextLoader will locate instances of WebApplicationInitializer on your classpath, by adding this and removing the intializers (which, as you have noted, are for ApplicationContextInitializers and not WebApplicationInitializers) then you should be all set.

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

Here is a working example

@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"));
    }
}
like image 57
lane.maxwell Avatar answered Sep 21 '22 03:09

lane.maxwell


The answer is "Sorry,you can't". You could refer to this: Spring FrameworkSPR-10199 Add capability to use WebApplicationInitializer for testing Spring web applications

Just as Sam Brannen said:

Although Spring does provide mocks for the Servlet API, Spring does not mock a Servlet container and currently has no intention to. Spring has always focused on out of container integration testing. Fully mocking a container is therefore beyond the scope of Spring's testing support. Please see comments from Rossen and me above for further details.

like image 23
Dennis Avatar answered Sep 20 '22 03:09

Dennis