Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在集成测试中模拟Spring HandlerInterceptorAdapter?_Java_Spring_Mocking_Integration Testing_Interceptor - Fatal编程技术网

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();
}