如何测试spring配置类?

新手上路,请多包涵

我有一个带有配置类的 spring 应用程序,其中实例是 bean。

应用类:

 @Configuration
@EnableAspectJAutoProxy
@EnableSpringDataWebSupport
@EnableTransactionManagement
@ComponentScan(basePackageClasses = Application.class)
@PropertySource(value = {"classpath:foo.properties"})
@EnableJpaRepositories(basePackageClasses = Application.class)
@EnableJpaAuditing
public class Application {

    @Inject
    private Environment env;

    @Bean
    JndiTemplate jndiTemplate() {
        return new JndiTemplate();
    }

    @Bean
    public DataSource dataSource() {
        DataSource dataSource = getDataSource();
        if (dataSource == null) {
            dataSource = new BasicDataSource();
            ((BasicDataSource) dataSource).setUsername(env.getProperty("jdbc.user"));
            ((BasicDataSource) dataSource).setPassword(env.getProperty("jdbc.password""));

            ((BasicDataSource) dataSource).setDriverClassName(env.getProperty("jdbc.driverClassName"));
            ((BasicDataSource) dataSource).setUrl(env.getProperty("jdbc.url"));
        }
        return dataSource;
    }

    @Bean
    public PlatformTransactionManager transactionManager() {
        EntityManagerFactory factory = entityManagerFactory().getObject();
        return new JpaTransactionManager(factory);
    }

    //....
}

Mvc配置类:

 @Configuration
@ComponentScan(basePackageClasses = Application.class, includeFilters = @Filter({Controller.class, Component.class}), useDefaultFilters = true)
class MvcConfiguration extends WebMvcConfigurationSupport {
    private static final String MESSAGES = "classpath:/i18n";

    private static final String VIEW_PREFIX = "/WEB-INF/views/";

    @Inject
    private Environment env;

    @Override
    public RequestMappingHandlerMapping requestMappingHandlerMapping() {
        RequestMappingHandlerMapping requestMappingHandlerMapping = super.requestMappingHandlerMapping();
        requestMappingHandlerMapping.setUseSuffixPatternMatch(false);
        requestMappingHandlerMapping.setUseTrailingSlashMatch(true);

        return requestMappingHandlerMapping;
    }

    @Bean(name = "messageSource")
    public MessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasename(MESSAGES);
        messageSource.setCacheSeconds(5);

        return messageSource;
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/").addResourceLocations("/static/**");
    }

    @Bean
    public MultipartResolver filterMultipartResolver(){
        CommonsMultipartResolver resolver = new CommonsMultipartResolver();
        resolver.setMaxUploadSize(Long.parseLong(env.getProperty("multipart.max.size")));
        return resolver;
    }

    //....

}

和 SecurityConfiguration 类:

 @Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    //....

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //Logout por POST con el valor de token csrf
        http.authorizeRequests()
                .antMatchers("/static/**").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .failureUrl("/login?error=1")
                .loginProcessingUrl("/authenticate")
                .and()
            .logout()
                .logoutUrl("/logout")
                .logoutSuccessUrl("/signin")
                .permitAll();
    }

}

我如何使用 JUnit 测试它们?如何测试在spring上下文中创建的bean?

原文由 oscar 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 726
2 个回答

我相信这只能通过集成测试来实现。

单元测试的目的不是检查是否成功创建了整个 Spring 上下文。

您可以使用模拟等单元测试来测试每个配置方法,以检查它们是否正常,但整个 Spring Context 是一个集成测试。

我过去常常通过执行 Spring Docs 所谓的“Spring 单元测试”来进行此配置测试(对我来说更像是控制器 + 视图的集成测试)

这个想法是,如果您可以为控制器集成测试运行 Spring 上下文,那么您的配置就可以了。

spring 文档中有一整章介绍如何进行此类测试。 http://docs.spring.io/spring/docs/current/spring-framework-reference/html/testing.html

原文由 renanleandrof 发布,翻译遵循 CC BY-SA 4.0 许可协议

一言以蔽之——“不要”,那是一种疯狂。

您真正想要的是更高级别的测试,这些测试利用您的 Spring 配置,但仍然关注 行为 而不是 _实现_。

例如,查看您的安全配置 - 您并不真正关心 configure 方法是否被调用,或者它做了什么,您想要测试的是:

  1. 静态页面不需要身份验证
  2. 其他页面确实需要身份验证
  3. 登录工作
  4. 注销工作

将 Spring 用于 DI 和安全只是 这些 东西的实现方式,而您的测试应该关注这些东西实际工作的事实。

原文由 tddmonkey 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题