java - ComponentScan excludeFilters 在 Spring 4.0.6.RELEASE 中不起作用

标签 java spring unit-testing dependency-injection

我有一个要在组件扫描时排除的类。我正在使用下面的代码来做到这一点,但这似乎不起作用,尽管一切似乎都是正确的

@ComponentScan(basePackages = { "common", "adapter", "admin"}, excludeFilters = { @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = ServiceImpl.class) })

实际上,我希望在我的其余 api 逻辑中使用实现“Service”接口(interface)的“ServiceImpl”类,并且在对 api 进行集成测试时,我想排除这个实现并加载模拟的实现。但这似乎并没有发生,因为即使在使用上述内容后我也收到以下错误

No qualifying bean of type [admin.Service] is defined: expected single matching bean but found 2: ServiceMockImpl,ServiceImpl

我在这方面花了太多时间,但没有任何效果。

感谢任何帮助。

最佳答案

经过大量工作和研究,我注意到 Spring 在组件扫描方面的行为有点奇怪。

Artifact 是这样的:

ServiceImpl是实现Service的真正实现类界面。 ServiceMockImpl是实现 Service 的模拟植入类界面。

我想调整组件扫描,使其仅加载 ServiceMockImpl但不是 ServiceImpl .

我必须添加 @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = ServiceImpl.class) , 在 @ComponentScan的测试配置类,从组件扫描中排除该特定类。但是,即使在进行了上述更改并且测试失败之后,这两个类都被加载了。

经过大量工作和研究,我发现 ServiceImpl正在加载,因为另一个类正在加载并且具有 @ComponentScan对于它上面的所有包。所以我添加了代码以排除 Application类从组件扫描如下@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = Application.class) .

之后它按预期工作。

如下代码

@ComponentScan(
    excludeFilters = {
        @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = OAuthCacheServiceImpl.class),
        @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = Application.class)
    },
    basePackages = {
        "common", "adapter", "admin"
    }
)

我已经看到很多关于组件扫描的问题长期以来都没有得到解答,因此我想添加这些详细信息,因为它可能对 future 的人有所帮助。

HTH...

关于java - ComponentScan excludeFilters 在 Spring 4.0.6.RELEASE 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25550494/

相关文章:

java - 将 http url 传递到 SAXParser XML 中

java - 为什么我的 Java 程序不将 String 写入文件?

java - 一对多 Spring 结果映射

java - Spring JmsTemplate 的守护线程在停止 tomcat 应用程序后仍保持 Activity 状态

javascript - Karma (mocha) - 每当单元测试失败时出现意外的标记 N

python - 我可以使用 unittest.mock.patch 修补 'random' 吗?

c++ - 使用 C++ 的 TDD 和内务管理开销

java - 用于视频下载的 Youtube API

java - 使用 * 语法添加组件

java - 如何使java枚举元素可配置