Spring - 在测试中替换@Service bean

标签 spring testing service configuration javabeans

在我的 spring boot 应用程序中,我有一个服务 bean(带有 @Service 注释),我想模拟这个服务,特别是 JUnit 测试(不是在所有测试中)。我怎样才能只为一个特定的测试替换这个服务 bean?

服务声明为:

@Service
public class LocalizationServiceImpl implements LocalizationService {
   ...
}

应用配置类:

@Configuration
@EnableAutoConfiguration
@ComponentScan(basePackages="my.package")
@EntityScan

public class Application {
...
}

测试类:

@Transactional
@SpringApplicationConfiguration(classes = LocalizationServiceTest.LocalizationServiceTestConfig.class)
public class LocalizationServiceTest extends ESContextTest {

    @Autowired
    private LocalizationService locService;

    @Configuration  
    public static class LocalizationServiceTestConfig {

        @Bean
        public LocalizationService localizationServiceImpl() {
            return mock(LocalizationService.class);
        }

    }
}

和测试类父类:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
public abstract class ESContextTest {
...
}

但这行不通。当我运行测试时,原始 LocalizationServiceImpl 用于 Autowiring 的 locService 属性。这出现在日志文件中: 跳过 [BeanMethod:name=localizationService,declaringClass=...LocalizationServiceTest$LocalizationServiceTestConfig] 的 bean 定义:bean“localizationService”的定义已经存在。此顶级 bean 定义被视为覆盖。

当我在 LocalizationServiceTestConfig 中为 @Bean 方法使用不同的名称时,例如localizationServiceMock() (与原始实现类名不同)然后 spring 抛出

'No qualifying bean of type is defined: expected single matching bean but found 2: localizationServiceImpl,localizationServiceMock'

所以我认为使用相同的名称是正确的。

唯一有效的解决方案是从 LocalizationServiceImpl 类中删除 @Service 注释并为正常(非测试)应用程序运行创建配置,如

@Configuration 
public class BeansConfig {
    @Bean
    public LocalizationService localizationServiceImpl() {
        return new LocalizationServiceImpl();
    }
}

然后在测试运行中 Autowiring 正确的模拟实现。

但应该可以通过@Service 注释来做同样的事情,不是吗?

感谢您的建议。

最佳答案

自己找到了一个解决方案:重命名localizationServiceImpl() 例如到类 LocalizationServiceTestConfig 中的 localizationServiceMock() 并用 @Primary 注释该方法。

但为什么简单地重新定义具有相同“id”的 bean 不能像通过 xml-config 那样工作?

关于Spring - 在测试中替换@Service bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31836227/

相关文章:

javascript - 我添加自定义过滤器来解决允许跨原点的问题,但仍然拒绝 Angular 仅发送选项方法,并且不发送 get 或 post

testing - 如何在 Cypress 中只保存部分 URL(没有域名)

android - 为 : ServiceRecord Kitkat 等待了足够长的时间

c# - 使用 c#/ASP.NET 添加自定义 SOAP header

java - Hibernate用户更新删除用户角色

spring - Spring MVC 如何处理多个用户

javascript - Protractor 处理异常;异步弹出; Javascript

c# - 存储库和服务设计问题

java - 在 API 请求上使用附加 header 参数跳过 Oauth 2.0 授权 - Spring Security

javascript - React/Jest 错误 : services. map is not a function