模拟 WebApplicationContext 在 Filter junit 测试中获取 属性
Mock WebApplicationContext to get property in Filter junit test
我有一个过滤器,我在其初始化方法中使用了来自 servlet 上下文的一些 属性:
@Override
public void init(FilterConfig filterConfig) {
prop = WebApplicationContextUtils.getRequiredWebApplicationContext(filterConfig.getServletContext()).getEnvironment().getProperty("my.property");
}
我正在为此过滤器编写单元测试,但我不知道如何模拟 WebApplicationContext 以使用 WebApplicationContextUtils 并设置它 属性。到目前为止,这是我尝试过的方法:
class FilterTest {
@MockBean
private FilterChain chain;
@MockBean
private WebApplicationContext webAppContextMock;
@MockBean
private HttpServletRequest httpServletRequest;
@MockBean
private HttpServletResponse httpServletResponse;
@Autowired
private MyFilter myFilter;
@Test
void doFilter() throws IOException, ServletException {
MockServletContext mockServletContext = new MockServletContext();
mockServletContext.setAttribute("my.property", "Property");
Mockito.when(WebApplicationContextUtils.getWebApplicationContext(Mockito.any(ServletContext.class))).thenReturn(webAppContextMock);
}
由于 webApplicationContext,我有一个 npe,我应该将这个 servlet 上下文映射到 webApplicationContext。我在这里缺少什么?提前致谢!
这里的问题是 getRequiredWebApplicationContext()
是 class WebApplicationContextUtils 的静态方法,不能使用 JUnit 直接模拟它。如果您真的想模拟它,请使用 power mock。
https://github.com/powermock/powermock/wiki/Mockito
为了简单起见,我采用了另一种方法,在我的过滤器中,我只是删除了 init 部分并像这样注入了环境 bean:
private final Environment environment;
public MyFilter(Environment environment) {
this.environment = environment;
}
在 doFilter 方法中:
String prop = environment.getProperty("my.property");
然后在我的测试中,过滤器能够访问 my.property 因为环境可以访问它。
我有一个过滤器,我在其初始化方法中使用了来自 servlet 上下文的一些 属性:
@Override
public void init(FilterConfig filterConfig) {
prop = WebApplicationContextUtils.getRequiredWebApplicationContext(filterConfig.getServletContext()).getEnvironment().getProperty("my.property");
}
我正在为此过滤器编写单元测试,但我不知道如何模拟 WebApplicationContext 以使用 WebApplicationContextUtils 并设置它 属性。到目前为止,这是我尝试过的方法:
class FilterTest {
@MockBean
private FilterChain chain;
@MockBean
private WebApplicationContext webAppContextMock;
@MockBean
private HttpServletRequest httpServletRequest;
@MockBean
private HttpServletResponse httpServletResponse;
@Autowired
private MyFilter myFilter;
@Test
void doFilter() throws IOException, ServletException {
MockServletContext mockServletContext = new MockServletContext();
mockServletContext.setAttribute("my.property", "Property");
Mockito.when(WebApplicationContextUtils.getWebApplicationContext(Mockito.any(ServletContext.class))).thenReturn(webAppContextMock);
}
由于 webApplicationContext,我有一个 npe,我应该将这个 servlet 上下文映射到 webApplicationContext。我在这里缺少什么?提前致谢!
这里的问题是 getRequiredWebApplicationContext()
是 class WebApplicationContextUtils 的静态方法,不能使用 JUnit 直接模拟它。如果您真的想模拟它,请使用 power mock。
https://github.com/powermock/powermock/wiki/Mockito
为了简单起见,我采用了另一种方法,在我的过滤器中,我只是删除了 init 部分并像这样注入了环境 bean:
private final Environment environment;
public MyFilter(Environment environment) {
this.environment = environment;
}
在 doFilter 方法中:
String prop = environment.getProperty("my.property");
然后在我的测试中,过滤器能够访问 my.property 因为环境可以访问它。