【问题标题】:How to disable jersey filters for unit tests only (using spring-boot)如何仅对单元测试禁用球衣过滤器(使用 spring-boot)
【发布时间】:2016-09-29 01:17:29
【问题描述】:

我有一个以 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);
        }
    }
    

【问题讨论】:

    标签: junit filter spring-boot jersey


    【解决方案1】:

    您最好的选择可能是使用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);
        }
    }
    

    并将其注册到测试配置中。

    【讨论】:

    • 是的。非常感谢。确实,我按照您的建议(几乎)使用了 Spring 配置文件,它看起来工作正常。唯一不同的是,我没有使用 @ActiveProfiles 注释,而是使用了 application.properties 文件中的 spring.profiles.active 属性。非常感谢。家伙
    猜你喜欢
    • 2011-05-27
    • 2014-02-20
    • 2018-07-19
    • 1970-01-01
    • 2021-08-28
    • 2020-09-29
    • 2015-09-19
    • 2018-08-06
    • 1970-01-01
    相关资源
    最近更新 更多