从SpringBoot WebMvcTest或WebMvcTest的其他应用程序上下文中扫描PropertySource

时间:2016-10-30 22:18:51

标签: java spring unit-testing spring-boot web-testing

我使用Spring Boot开发Web应用程序。我对网络层的单元测试有问题。 对于这些测试,我使用注释@WebMvcTest。问题是我的主配置类包含带有java arg的@PropertySource,其中包含外部属性文件的路径,当我开始我的单元web测试时,发生错误,这个java arg无法被解析(当然我可以添加这个java arg来运行我的测试配置,但是我的web单元测试不需要这个文件。)

我的主要配置类:

@SpringBootApplication
@PropertySource(value = {"${pathto.configfile}"})
@EnableAspectJAutoProxy
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

我的第一个解决方案是使用"!test"配置文件创建单独的配置类,并将@PropertySource("..")重新定位到它。我的单元测试添加@ActiveProfiles("test")

我的第二个配置类:

@Configuration
@Profile({"!test"})
@PropertySource(value = {"${pathto.configfile}"})
public class PropertyConfiguration {

}

对于单位网络测试,此解决方案非常有效。但是在我的网络应用程序启动时会出现新问题。在我的外部属性文件中 财产spring.profiles.active。对于此属性,我指定了dbfile值。根据其值,创建Repository的适当实现并将其注入我的服务层。当值为db时,应用就会启动, 但当值为file时,会抛出错误:NoSuchBeanDefinitionException

当我回到我之前的版本(没有第二个配置文件)时,应用程序在两种情况下都启动良好(但不是网络单元测试)

所以,请解释一下,为什么当spring.profiles.active=db的值,应用程序开始正常,但spring.profiles.active=file时失败。为什么我可以解决我的任务? 我试图找到如何将其他应用程序上下文添加到我的Web单元测试中,但我没有找到。 有什么想法吗?:)

1 个答案:

答案 0 :(得分:0)

对于我的数据库存储库,我使用的是Spring Data JPA,所以我没有创建这些存储库的实现,但是我创建了我的文件的实现 存储库,我的实现有popupMenu.setFocusable(false);。从实现中删除此批注后,它仅在接口上留下。我不知道为什么一个配置类工作,但两个类没有。但问题解决了)