单元测试Spring Cloud Service的策略

时间:2015-12-16 08:52:47

标签: spring unit-testing spring-cloud netflix-eureka

给定以下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服务器的可访问,正在运行的实例的唯一方法吗?

3 个答案:

答案 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 {
}

聚苯乙烯。我无法对原始回复发表评论,所以我创建了一个新答案。