如何在单元测试中使用Spring Boot禁用Jersey过滤器

3

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

以下是我的内容:

  • Spring boot application:

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

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

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子类,那么创建不同的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);
    }
}

并在测试配置中注册此项。


是的。非常感谢。我确实像你建议的那样使用了Spring配置文件,看起来它运行得很好。唯一不同的是,我没有使用@ActiveProfiles注释,而是使用了application.properties文件中的spring.profiles.active属性。非常感谢。Guy - Guy Hudara

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接