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?
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.
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.
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"));
}
}
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With