如何对存储了数据的类使用Spring依赖注入?

vs91vp4v  于 2023-04-28  发布在  Spring
关注(0)|答案(1)|浏览(124)

我有一个存储数据的类,需要访问外部服务。如何配置这个类,以便可以使用数据示例化它,同时仍然允许在测试中注入服务的模拟?

@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:

  1. TestOnly构造函数
    1.覆盖adapterService的TestOnly Setter
    1.通过反射设置adapterService属性
    请告诉我,这些不是唯一的选项,Spring提供了对这个常见用例的支持!
piwo6bdm

piwo6bdm1#

我想你正在使用没有spring的测试(普通单元测试)和JUnit之类的东西。在这种情况下,我建议从字段注入(用于注入服务)转移到构造函数注入。你的类看起来像这样:

@Service
@Scope("prototype")
final class Adapter {
    private final AdapterService adapterService; // note, I've removed an @Autowired annotation
    private final Options s;

    @Autowired // if this is a single constructor, this annotation is not mandatory
    Adapter(AdapterService adapterService, @NotNull Options options) {
        this.adapterService = adapterService;
        this.options = options;
    }
}

我看到Adapter是一个原型,但Spring仍然能够注入AdapterService的单例示例,只要它也是由Spring定义的(它本身就是一个bean)。
现在,在单元测试中,您将创建一个Adapter类,并且可以通过任意数量的模拟:

class AdapterTest {
  
  @Test  
  void mytest() {
     AdapterService adapterService = Mockito.mock(AdapterService.class);
     Options options = ...;
     Adapter underTest = new Adapter(adapterService, options);
  }
}

相关问题