java - Spring JUnit 测试未加载完整的应用程序上下文

标签 java spring junit spring-boot spring-test

您好,我正在尝试使用 spring 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 的输出来看,它似乎并没有这样做。

最佳答案

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

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

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

关于java - Spring JUnit 测试未加载完整的应用程序上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28712134/

相关文章:

java - 如何在 snakeyaml 中用破折号解析字段名称?

java.lang.OutOfMemory错误: GC overhead limit exceeded : Application deployed in weblogic

java - spring jdbctemplate 获取字节数组

java - 如何将 EasyMock 模拟注入(inject)测试类私有(private)字段

java - File.list() 为目录返回 null

java - MyBatis 执行获取并基于返回值在 Xxxmapper.xml 中执行更新/插入?

Java 分割命令行参数

java - Spring、MVC 和重用部分模型的策略

java - Serenity BDD 入门

java - 模拟正在测试的同一类中的 void 方法