如何解决在SpringBootApplicationTest中从应用程序上下文中排除EurekaClient Bean
我正在尝试使用以下测试配置针对我的Spring Data API编写集成测试。
eureka:
client:
enabled: false
[..] # No other configuration part that affects discovery/eureka client
这是我的考试班
@SpringBootTest
@AutoConfigureMockMvc(addFilters = false)
@Transactional
class FooAPITest {
@Test
void contextLoads() {
}
}
但是我有一个注入EurekaClient的组件以从中获取服务实例
@Component
public class ServiceClient {
@Autowired
public ServiceClient(@Qualifier("eurekaClient") EurekaClient eurekaClient) {
URI serviceUri = URI.create(eurekaClient.getNextServerFromEureka("service",false).getHomePageUrl());
}
}
因此,从此服务开始,我的应用程序无法加载ApplicationContext。
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.netflix.discovery.EurekaClient' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Qualifier(value="eurekaClient")}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1695)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1253)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1207)
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:885)
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:789)
... 81 more
到目前为止我尝试过的事情
我考虑过设置自定义ContextConfiguration来排除ServiceClient
,因为在测试类中不需要它。但是,我需要包含一个自动连接EntityManager的配置文件,但是当我使用@SpringBootApplication(classes = {Configuration.class})
时,无法注入EntityManager。此配置如下所示:
@Configuration
class Configuration {
@Autowired
EntityManager entityManager;
}
这会产生相同的错误,但使用EntityManager Bean:
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'javax.persistence.EntityManager' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1695)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1253)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1207)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640)
... 81 more
当前解决方法
目前,我通过模拟ServiceClient
来避免此问题,但是我想摆脱这种代码的味道。
@MockBean
ServiceClient serviceClient;
@BeforeEach
void setUp() {
MockitoAnnotations.initMocks(FooAPITest.class);
}
另一种解决方法是将注入的Bean标记为不需要,但我认为仅使测试有效并不可行。
解决此问题的正确方法是什么?
解决方法
您可以尝试在测试中模拟EurekaClient
:
@SpringBootTest
@AutoConfigureMockMvc(addFilters = false)
@Transactional
class FooAPITest {
@MockBean
private EurekaClient eurekaClient;
@Test
void contextLoads() {
}
}
这将在EurekaClient
中将ApplicationContext
创建为模拟bean,以注入到您的服务中。
如果您有其他初始化Spring ApplicationContext
的测试,则可以在要扫描的应用程序包中创建一个单独的配置类(使用@ConditionalOnMissingBean
注释覆盖所有基础):
@Configuration
public class MockEurekaConfiguration {
@Bean
@ConditionalOnMissingBean
public EurekaClient eurekaClient() {
return Mockito.mock(EurekaClient.class);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。