gpt4 book ai didi

spring - Spring 扫描仪为所有测试拾取带有 @Configuration 的内部静态类。怎么了?

转载 作者:行者123 更新时间:2023-12-02 01:19:25 26 4
gpt4 key购买 nike

Spring 从 Test2 中获取 Test1 的内部 @Configuration。我在 Test2 中需要一个模拟的 IService,但在 Test1 中需要一个真正的 ServiceImpl。另外,我希望所有测试都有通用的 TestConfiguration 。但我总是在这两个测试中 mock IService。怎么了?

如何禁用兄弟测试的内部配置拾取?

这是我的代码:

ServiceImpl.java:

@Service
public class SeriviveImpl implements IService {
}

测试配置.java:

@Configuration
@ComponentScan
public class TestConfiguration {
// empty
}

测试1.java:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {TestConfiguration.class})
public class Test1 {
@Autowired
private IService service;
}

Test2.java

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {Test2.CustomConfiguration.class, TestConfiguration.class})
public class Test2 {
@Autowired
private IService service;

@Configuration
static class CustomConfiguration {
@Bean
IService service() {
return mock(IService.class);
}
}
}

最佳答案

您可以从 TestConfiguration @ComponentScan 中过滤内部类:

@Configuration
@ComponentScan(excludeFilters = {
@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,
value = Test2.CustomConfiguration.class)
})
public class TestConfiguration {
// empty
}

这将防止它在 Test1 中被拾取。

编辑 或者,如果您有大量内部配置,您可以创建自己的注释并从 @ComponentScan 中过滤所有这些带注释的类:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Configuration
public @interface InnerConfiguration {
}

然后在您的内部类上使用此注释而不是@Configuration:

@InnerConfiguration
static class CustomConfiguration {
@Bean
IService service() {
return mock(IService.class);
}
}

并从组件扫描中过滤掉这些内容,如下所示:

@Configuration
@ComponentScan(excludeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION,
value = InnerConfiguration.class)
})
public class TestConfiguration {
// empty
}

关于spring - Spring 扫描仪为所有测试拾取带有 @Configuration 的内部静态类。怎么了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46343450/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com