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

这是我的:

  • Spring Boot 应用:

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

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

请您参考如下方法:

最好的选择可能是使用 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 子类,创建不同的 spring 配置可能更有意义。您可以为不同的配置创建 @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); 
    } 
} 

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


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!