【问题标题】:Spring JUnit Test not loading full Application ContextSpring JUnit 测试未加载完整的应用程序上下文
【发布时间】:2015-04-27 00:58:11
【问题描述】:

您好,我正在尝试创建 junit 测试用例...并且我需要加载完整的应用程序上下文。但是,junit 测试不会初始化完整的应用程序上下文。

测试类:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
public class MongoDbRepositoryTest {

    @Value("${spring.datasource.url}")
    private String databaseUrl;

    @Inject
    private ApplicationContext appContext;

    @Test
    public void testCRUD() {
        System.out.println("spring.datasource.url:" + databaseUrl);
        showBeansIntialised();
        assertEquals(1, 1);
    }

    private void showBeansIntialised() {
        System.out.println("BEEEAAANSSSS");
        for (String beanName : appContext.getBeanDefinitionNames()) {
            System.out.println(beanName);
        }
    }

输出:

spring.datasource.url:${spring.datasource.url}
BEEEAAANSSSS
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalRequiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.annotation.internalPersistenceAnnotationProcessor
org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor
org.springframework.context.annotation.ConfigurationClassPostProcessor.enhancedConfigurationProcessor

主要应用类注解:

@ComponentScan(basePackages = "com.test")
@EnableAutoConfiguration(exclude = { MetricFilterAutoConfiguration.class, MetricRepositoryAutoConfiguration.class })
@EnableMongoRepositories("com.test.repository.mongodb")
@EnableJpaRepositories("com.test.repository.jpa")
@Profile(Constants.SPRING_PROFILE_DEVELOPMENT)
public class Application { ...

因此它应该扫描 com.test 包中的所有 spring bean,并将它们加载到 Junit 测试用例的 applicationcontext 中。但从 bean initalized 的输出来看,它似乎并没有这样做。

【问题讨论】:

  • 一方面,您的应用程序类仅对您未设置为在测试中处于活动状态的配置文件有效。

标签: java spring junit spring-boot spring-test


【解决方案1】:

您需要使用@ActiveProfiles 注释您的测试类,如下所示;否则,您的Application 配置类将始终禁用。这就是为什么您目前在ApplicationContext 中看不到任何您自己的 bean。

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@ActiveProfiles(Constants.SPRING_PROFILE_DEVELOPMENT)
public class MongoDbRepositoryTest { /* ... */ }

另外,Application 应该用 @Configuration 注释,正如其他人提到的那样。

【讨论】:

  • 感谢 Sam..这解决了我的问题!还要感谢您对 Spring Recipes 的贡献。它是我学习 Spring 的第一批资源之一!
【解决方案2】:

您是否可能在 Application 类上缺少 @Configuration 注释?

【讨论】:

  • 即使在我的 Application.class 中添加了@Configration 之后它也没有工作。
  • 由于无法发表评论,我发布了一个答案。注明以供将来参考。
【解决方案3】:

在每个测试类中添加 @ActiveProfile 你无法更好地扩展在 VM 选项中添加了这个

-Dspring.profiles.active=test

【讨论】:

    猜你喜欢
    • 2013-02-03
    • 2018-07-11
    • 2013-02-08
    • 2021-06-23
    • 2021-08-02
    • 2012-01-20
    • 2011-05-12
    • 2021-06-08
    • 1970-01-01
    相关资源
    最近更新 更多