我有一个存储数据的类,需要访问外部服务。如何配置这个类,以便可以使用数据示例化它,同时仍然允许在测试中注入服务的模拟?
@Service
@Scope("prototype")
final class Adapter {
@Autowired private AdapterService adapterService;
private final Options s;
@Autowired
Adapter(@NotNull Options options) {
this.options = options;
}
}
@Test
void adapter() {
// How do I inject mock(AdapterService.class)?
Adapter adapter = applicationContext.getBean(Adapter.class, options);
}
我玩过的一些hacky workarounds:
- TestOnly构造函数
1.覆盖adapterService的TestOnly Setter
1.通过反射设置adapterService属性
请告诉我,这些不是唯一的选项,Spring提供了对这个常见用例的支持!
1条答案
按热度按时间piwo6bdm1#
我想你正在使用没有spring的测试(普通单元测试)和JUnit之类的东西。在这种情况下,我建议从字段注入(用于注入服务)转移到构造函数注入。你的类看起来像这样:
我看到
Adapter
是一个原型,但Spring仍然能够注入AdapterService
的单例示例,只要它也是由Spring定义的(它本身就是一个bean)。现在,在单元测试中,您将创建一个
Adapter
类,并且可以通过任意数量的模拟: