如何在集成测试中模拟Spring HandlerInterceptorAdapter?

时间:2018-03-25 10:24:51

标签: java spring mocking integration-testing interceptor

说我有一些FooInterceptor

public class FooInterceptor extends HandlerInterceptorAdapter {
   // ...
}

在上下文中配置:

 <mvc:interceptors>
     <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="my.package.FooInterceptor"/>
     </mvc:interceptor>
 </mvc:interceptors>

我正在为某个控制器创建集成测试:

@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(value = "/context.xml")
@ActiveProfiles("test")
public class SomeControllerIT {

    @Autowired
    private WebApplicationContext webApplicationContext;

    private MockMvc mockMvc;

    @Before
    public void setup() {
        mockMvc = MockMvcBuilders
                .webAppContextSetup(webApplicationContext)
                .apply(springSecurity())
                .build();
    }

    ...
}

我试图通过创建自定义配置来模拟它:

@Configuration
static class Config {

    @Bean
    @Primary
    public FooInterceptor getFooInterceptor() {
        return mock(FooInterceptor.class);
    }
}

但在我看来它并不适合工作。实际FooInterceptor仍在制作并参与测试。

如何正确模拟它?

3 个答案:

答案 0 :(得分:1)

不仅仅是向拦截器注入更简单,更清洁的方法吗?

object

答案 1 :(得分:1)

您可以按照Luana FM在上一个答案中的建议进行以下操作。另外,您还需要一行模拟代码来在@BeforeEach块中以 true 的形式返回拦截器的响应。

        @BeforeEach
        public void before() {
          MockitoAnnotations.initMocks(this);
          mockMvc = MockMvcBuilders
              .standaloneSetup(controller)
              .addInterceptors(interceptor)
              .build();
        when(interceptor.preHandle(Mockito.any(), Mockito.any(), Mockito.any())).thenReturn(true);
    
        }

答案 2 :(得分:0)

所以我继续写了一些代码来解决我遇到的同样问题。在我们的测试用例项目中,我们可以通过显式定义扩展HandlerInterceptorAdapter的拦截器来模拟拦截器,该拦截器将具有模仿我们原始拦截器的模拟逻辑

public class MockTenantInterceptor extends HandlerInterceptorAdapter

我们可以在不自动装配的情况下初始化模拟拦截器类,然后继续在TestConfiguration类中进行注册。确保确保,因为我们将为WebConfig和TestConfig提供2个配置类,以添加spring概要文件注释,以防止调用生产拦截器。

@Profile("test")
@TestConfiguration
@EnableJpaAuditing
public class TestConfig extends WebMvcConfigurerAdapter {


    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        MockTenantInterceptor mockTenantInterceptor = new MockTenantInterceptor();
        registry.addInterceptor(mockTenantInterceptor);
    }
}