Java 如何在集成测试中模拟Spring HandlerInterceptorAdapter?
假设我有一些Java 如何在集成测试中模拟Spring HandlerInterceptorAdapter?,java,spring,mocking,integration-testing,interceptor,Java,Spring,Mocking,Integration Testing,Interceptor,假设我有一些fooointerceptor: public class FooInterceptor extends HandlerInterceptorAdapter { // ... } 这是在上下文中配置的: <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="my.package.FooInter
fooointerceptor
:
public class FooInterceptor extends HandlerInterceptorAdapter {
// ...
}
这是在上下文中配置的:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="my.package.FooInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
我尝试通过创建自定义配置来模拟它:
@Configuration
static class Config {
@Bean
@Primary
public FooInterceptor getFooInterceptor() {
return mock(FooInterceptor.class);
}
}
但在我看来,它似乎不起作用。实际的foodinterceptor
仍在生产中,并参与测试
如何正确地模拟它?所以我继续写了一些代码来解决我遇到的相同问题。在我们的测试用例项目中,我们可以通过显式定义我们自己的拦截器来模拟拦截器,该拦截器扩展了HandlerInterceptorAdapter,该拦截器将具有模拟原始拦截器的模拟逻辑
public class MockTenantInterceptor extends HandlerInterceptorAdapter
我们可以在不自动连接的情况下初始化模拟拦截器类,并继续在TestConfiguration类中注册它。请务必确保,因为我们将有两个配置类,一个用于WebConfig和TestConfig,以添加spring概要文件注释,防止调用生产拦截器
@Profile("test")
@TestConfiguration
@EnableJpaAuditing
public class TestConfig extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
MockTenantInterceptor mockTenantInterceptor = new MockTenantInterceptor();
registry.addInterceptor(mockTenantInterceptor);
}
}
编辑:在Spring5/SpringBoot2中,扩展WebMVCConfigureAdapter
已被弃用,取而代之的是实现WebMvcConfigurer
并使用Java8新的默认接口方法
参见注入拦截器不仅仅是一种更简单、更干净的方法吗
private MockMvc mockMvc;
@MockBean
private MyInterceptor interceptor;
@BeforeEach
public void before() {
MockitoAnnotations.initMocks(this);
mockMvc = MockMvcBuilders
.standaloneSetup(controller)
.addInterceptors(interceptor)
.build();
}
您可以按照Luana FM在上一个答案中的建议进行以下操作。此外,在每个块之前的
@中,还需要一行模拟代码将拦截器的响应返回为true
@beforeach
在()之前公开无效{
initMocks(this);
mockMvc=MockMvcBuilders
.standaloneSetup(控制器)
.附加接收器(拦截器)
.build();
when(interceptor.preHandle(Mockito.any(),Mockito.any(),Mockito.any())。然后返回(true);
}
private MockMvc mockMvc;
@MockBean
private MyInterceptor interceptor;
@BeforeEach
public void before() {
MockitoAnnotations.initMocks(this);
mockMvc = MockMvcBuilders
.standaloneSetup(controller)
.addInterceptors(interceptor)
.build();
}