【问题标题】:Spring inject test: Bean is not injected on testSpring注入测试:测试时未注入Bean
【发布时间】:2018-10-29 15:44:41
【问题描述】:

我已经创建了这个自定义测试配置:

@TestConfiguration
public static class RestTemplateTestConfiguration {

    @Bean
    @Primary
    public static ApplicationDao applicationDao() {
        ApplicationDao mock = Mockito.mock(ApplicationDao.class);
        // some stuff code
        return mock;
    }
}

我在applicationDao 上设置了一个断点,但它从未到达过,因此永远不会注入模拟。

编辑

ApplicationDao 是一个 @Repository 注释类:

@Repository
public interface ApplicationDao extends MongoRepository<Application, String> {

那么,我怎样才能覆盖这个 @Repository 带注释的 AplicationDao

目前,我在春季开始时收到此消息:

跳过 [BeanMethod:name=applicationDao,declaringClass=net.gencat.transversal.espaidoc.functional.references.GroupReferencesTest$RestTemplateTestConfiguration] 的 bean 定义:bean 'applicationDao' 的定义已经存在。此顶级 bean 定义被视为覆盖。

有什么想法吗?

【问题讨论】:

  • 为什么要使用静态类和静态方法?
  • 这是一个嵌套类

标签: spring-boot mockito


【解决方案1】:

如果您的方法applicationDao() 从未被调用,则意味着您的spring boot 没有扫描RestTemplateTestConfiguration 所在的包。

最简单的解决方案是将配置移动到与包含 @SpringBootApplication 注释的类相同的包(或其子包)下。

OBS :即使配置位于test 目录而不是main 中,此规则也适用。

另一种解决方案是在配置包中添加@ComponentScan,或者在您的Spring Boot 测试级别使用@Import(RestTemplateTestConfiguration.class)

建议: 对于您的问题,您可以使用:

@Mock
ApplicationDao applicationDao;

如果您有其他使用此服务的服务:

@InjectMock
MyService myService;

【讨论】:

  • 我查看了日志,我刚刚意识到它让我收到这条消息:Skipping bean definition for [BeanMethod:name=applicationDao,declaringClass=net.gencat.transversal.espaidoc.functional.references.GroupReferencesTest$RestTemplateTestConfiguration]: a definition for bean 'applicationDao' already exists. This top-level bean definition is considered as an override. 它告诉你更多信息吗?
  • 我为您的问题添加了建议,如果您需要覆盖 bean 定义,请提及。
猜你喜欢
  • 2022-01-19
  • 1970-01-01
  • 2012-04-06
  • 2015-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多