我使用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
。对于此属性,我指定了db
或file
值。根据其值,创建Repository的适当实现并将其注入我的服务层。当值为db
时,应用就会启动,
但当值为file
时,会抛出错误:NoSuchBeanDefinitionException
。
当我回到我之前的版本(没有第二个配置文件)时,应用程序在两种情况下都启动良好(但不是网络单元测试)
所以,请解释一下,为什么当spring.profiles.active=db
的值,应用程序开始正常,但spring.profiles.active=file
时失败。为什么我可以解决我的任务?
我试图找到如何将其他应用程序上下文添加到我的Web单元测试中,但我没有找到。
有什么想法吗?:)
答案 0 :(得分:0)
对于我的数据库存储库,我使用的是Spring Data JPA,所以我没有创建这些存储库的实现,但是我创建了我的文件的实现
存储库,我的实现有popupMenu.setFocusable(false);
。从实现中删除此批注后,它仅在接口上留下。我不知道为什么一个配置类工作,但两个类没有。但问题解决了)