给定以下Spring Cloud设置:data-service
可以访问数据库,eureka-service
可以处理服务注册和发现,第三种服务business-service
可以是各种服务之一它封装了商业案例。
单位测试data-service
没问题,我只是通过
eureka.client.enabled=false
并使用内存数据库进行测试。
要从data-service
访问business-service
,我正在使用名为@FeignClient("data-service")
的{{1}}带注释的界面,DataClient
需要它。如果两者都在运行,Eureka会发现该服务。这适用于所有服务正在运行的类似生产的设置。
但现在我想对我@Autowired
的某些功能进行单元测试。使用
business-service
就像我在@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@IntegrationTest("server.port:0")
@SpringApplicationConfiguration(classes = Application.class)
做的那样。问题是我的data-service
的Eureka依赖发现...所以我的测试类崩溃了,因为自动装配我的FeignClient
- 实例不起作用。
我是否能告诉Spring只为我的测试使用伪造的DataClient
实例?或者是让我的测试运行DataClient
和我的Eureka服务器的可访问,正在运行的实例的唯一方法吗?
答案 0 :(得分:13)
1,首先创建配置bean,让发现客户端和feignclient仅在" eureka.enabled"是真的
@Configuration
@EnableDiscoveryClient
@EnableFeignClients
@ConditionalOnProperty(name = "eureka.enabled")
public class EurekaConfig {
}
2,禁用测试配置文件的eureka配置,因此在application-test.yml
中eureka:
enabled: false
3,我的项目是由maven构建的,所以我为我的假装客户端界面创建了一个工具,例如:
@Service
public class DataServiceImpl implements DataService {}
之后,当您使用
在单元测试中运行测试时@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@IntegrationTest({"server.port=0", "management.port=0", "spring.profiles.active=test"})
public abstract class AbstractIntegrationTests {}
虚假服务将注入春季环境。
或者对于正常的单元测试用例,你可以只需要mockito模拟服务类并使用set方法或构造方法在类中注入模拟对象
答案 1 :(得分:1)
我的第一次尝试因为另一个错误而崩溃了...所以它适用于@Configuration
带注释的类Conf
,这会创建DataClient
这样的虚假实现:
@Bean
@Primary
public DataClient getDataClient() {
...
}
通过
添加到我的测试中@SpringApplicationConfiguration(classes = {Application.class, Conf.class})
测试的服务实例正确使用虚假实现。
答案 2 :(得分:0)
在Yunlong的答案中添加关于单独配置类的注释。
如果配置类放在与根包不同的包下,则需要为@EnableFeignClients指定“basePackages”以扫描带注释的@FeignClient组件。
com.feign.client.FeignClient.class
@FeignClient(value = "${xxxx}")
public interface FeignClient {
}
com.feign.config.EurekaConfig.class
@Configuration
@EnableFeignClients(basePackages = {"com.feign.client"})
@EnableEurekaClient
@ConditionalOnProperty(name = "eureka.enabled")
public class EurekaClientConfig {
}
聚苯乙烯。我无法对原始回复发表评论,所以我创建了一个新答案。