首页 > 解决方案 > 如何在 Spring 中测试自定义 WebApplicationInitializer

问题描述

我将 web.xml 移动到 Java 注释配置

我的自定义代码是

public class WebInitializer implements WebApplicationInitializer {

@Override
public void onStartup(ServletContext container) {
    AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
    context.setDisplayName("app-name");
    context.register(Config.class);
    container.addListener(new RequestContextListener());
    container.addListener(new ContextLoaderListener(context));

    Dynamic dispatcher = container.addServlet("app-name", new DispatcherServlet(context));
    dispatcher.setLoadOnStartup(1);
    dispatcher.addMapping("/app-name-rest/*");
}

我尝试了解决方案https://stackoverflow.com/a/25210356/6700081但线路覆盖率仍为 0%

标签: spring-bootspring-mvcspring-test

解决方案


我有同样的问题并以这种方式解决:

public class WebInitializerTest {

@Mock
private MockServletContext mockServletContext;

@Mock
private ServletRegistration.Dynamic mockServletRegistration;

@BeforeEach
public void setUp() {
    MockitoAnnotations.initMocks(this);
}

@Test
public void testOnStartup() {
    WebInitializer webInitializer = new WebInitializer();
    when(mockServletContext.addServlet(ArgumentMatchers.eq("app-name"), any(Servlet.class))).thenReturn(mockServletRegistration);

    webInitializer.onStartup(mockServletContext);

    verify(mockServletContext, times(1)).addListener(any(RequestContextListener.class));
    // other asserts..
}}

注意:我使用 Junit5 (@BeforeEach)


推荐阅读