如何仅为单元测试禁用球衣过滤器(使用spring-boot)

时间:2016-05-31 06:50:49

标签: junit filter spring-boot jersey

我有一个使用Jersey作为REST引擎的spring-boot应用程序。 我正在使用Jersey过滤器来验证每个请求。 问题是在REST控制器的单元测试期间(使用JUnit)禁用这些过滤器或提供模拟过滤器的适当方法是什么?

这就是我所拥有的:

  • Spring启动应用程序:

    @PropertySource("classpath:security-api.properties")
    @SpringBootApplication
    public class MyApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(MyApplication.class, args);
        }
    }
    
  • 泽西岛配置文件:

    @Configuration
    @ApplicationPath("/some/path")
    public class MyJerseyConfiguration extends ResourceConfig {
    
        public AnalyzerJerseyConfiguration() {
            packages(BaseController.class.getPackage().getName());
            register(AuthorizationRequestFilter.class);
            register(AuthorizationResponseFilter.class);
        }
    }
    

1 个答案:

答案 0 :(得分:3)

可能你最好的选择是使用Spring Profiles。您可以将帖子中的ResourceConfig标记为"制作"配置,而对于测试,创建一个新的ResourceConfig与"测试"轮廓。然后在测试中将活动配置文件设置为"test",在生产环境中,将活动配置文件设置为"production"

@Profile("production")
@Configuration
@ApplicationPath("/some/path")
public class MyJerseyConfiguration extends ResourceConfig {

    public AnalyzerJerseyConfiguration() {
        packages(BaseController.class.getPackage().getName());
        register(AuthorizationRequestFilter.class);
        register(AuthorizationResponseFilter.class);
    }
}

@Profile("test")
@Configuration
@ApplicationPath("/some/path")
public class TestConfiguration extends ResourceConfig {

    public AnalyzerJerseyConfiguration() {
        packages(BaseController.class.getPackage().getName());
        register(TestRequestFilter.class);
        register(TestResponseFilter.class);
    }
}

@ActiveProfiles("test")
@RunWith(SpringJUnit4ClassRunner.class)
public class TestClass {}

您还可以在属性配置文件中设置活动配置文件(如上面链接中所述)。

如果您需要针对不同测试的不同配置,而不是创建一堆ResourceConfig子类,那么创建不同的弹簧配置可能更有意义。您可以为不同的配置创建@Bean方法。

@Profile("test")
@Configuration
public class TestOneConfig {
    @Bean
    public ResourceConfig resourceConfig() {
        return new ResourceConfig()
            .register(Something.class);
    }
}

@Profile("test")
@Configuration
public class TestTwoConfig {
    @Bean
    public ResourceConfig resourceConfig() {
        return new ResourceConfig()
            .register(DifferentSomething.class);
    }
}

无论您想使用哪一个,只需将其添加到测试配置中即可。

@ActiveProfiles("test")
@SpringApplicationConfiguration(classs={MainApp.class, TestOneConfig.class})
public class TheTest {}

使用Spring Boot 1.4(尚未发布),他们会引入ResourceConfigCustomizer。这可能会使它更干净,而不需要创建一个"测试" ResourceConfig,您可以执行类似

的操作
@Component
public class TestCustomizer implements ResourceConfigCustomizer {
    @Override
    public void customize(ResourceConfig config) {
        config.getClasses().remove(AuthorizationRequestFilter.class);
        config.register(TestRequestFilter.class);
    }
}

并在测试配置中注册。