当前位置: 首页 > 知识库问答 >
问题:

在SpringBootApplicationTest中从应用程序上下文中排除EurekaClient Bean

端木承业
2023-03-14
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

到目前为止我所尝试的

@Configuration
class Configuration {
  @Autowired
  EntityManager entityManager;
}
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
@MockBean
ServiceClient serviceClient;

@BeforeEach
void setUp() {
  MockitoAnnotations.initMocks(FooAPITest.class);
}

解决这个问题的恰当方法是什么?

共有1个答案

吕德惠
2023-03-14

您可以尝试在测试中模拟Eurekaclient:

@SpringBootTest
@AutoConfigureMockMvc(addFilters = false)
@Transactional
class FooAPITest {
  
  @MockBean
  private EurekaClient eurekaClient;
  
  @Test
  void contextLoads() {
  }

}

这将在applicationcontext中创建Eurekaclient作为模拟bean,并将其注入到服务中。

如果您有其他测试来初始化SpringApplicationContext,则可以在要扫描的应用程序包中创建一个单独的配置类(使用@ConditionalOnMissingBean注释来覆盖所有基础):

@Configuration
public class MockEurekaConfiguration {

  @Bean
  @ConditionalOnMissingBean 
  public EurekaClient eurekaClient() {
    return Mockito.mock(EurekaClient.class);
  }

}
 类似资料:
  • 我有一堆模块(比如3)。两个是基于Spring Boot的模块,另一个是基于Spring的模块。例如模块1-SpringBoot模块2-Spring Boot模块3-Common模块仅基于Spring 模块3@配置文件定义,只需要由模块2选择,而不是模块1。 除了放入一个不同的包之外,我知道如何在Spring Boot模块中禁用组件扫描非Spring Boot模块。我不想放不同的包裹。 任何帮助都

  • 我正在处理一个Spring Boot应用程序,其中我使用该应用程序公开SOAP WebService。我在Spring boot应用程序中使用Apache CFX framework for SOAP impl。我正在使用基于注释的方法。 我在一个bean中的Spring Boot配置文件中设置应用程序上下文时遇到了问题。下面是我的代码。 配置文件如下所示。 现在我有了bean SOAPproce

  • 我如何编辑我的函数以从我的用户状态中删除项目?在user.cart中,它是数组。 函数如下: 下面是按钮:

  • 我多年来一直在使用Spring MVC,我试图理解与Spring Boot的一些关键区别。 你能帮我确认一下吗?或者让我明白我在这里遗漏了什么?

  • 问题内容: 您可以在不使用元素的情况下在Spring application-context.xml文件中创建列表吗? 我有一个其构造函数带有对象的bean,并且我想通过“ value”属性传递整个列表。原因是此值来自.properties文件,您无法在.properties文件中定义列表。 我想做这样的事情…可能吗? MyClass.java: application-context.xml: