对于基于Guice的应用程序的集成测试,我很难找到有效的解决方案。
它比Guice doc上的HelloWorld示例稍微复杂一些。
这个想法是为了提供junit扩展来注入所有依赖项(就像一个真实的的应用程序),但是我需要在beforeEach
中重新注入一些模块,同时我还需要在beforeAll
中支持注入器创建逻辑,我需要绑定一些严重的类似于数据库的模块、队列。
最大的问题是如何正确处理beforeAll
和after
中示例化的模块的未关闭连接
class Extension implements BeforeAllCallback, BeforeEachCallback,
AfterAllCallback, AfterEachCallback {
private Injector injector;
@Override
public void beforeAll(ExtensionContext extensionContext) {
// modules = some havyweight modules (db, etc)
injector = Guice.createInjector(modules);
dbMigrate(injector);
}
@Override
public void beforeEach(ExtensionContext context) {
// modules like mocks, time-mocks
List<AbstractModule> newModules = Stream.concat(oldModules, tempModules).collect(Collectors.toList());
injector = Create.createInjector(newModules);
}
}
这意味着我创建了两次recreate硬资源,其中一些资源无法正确释放。
我尝试在beforeEach
中创建子注入器,但它对我不起作用,因为我需要在每次测试后重新绑定这些模块。
有人能建议如何科普吗?
1条答案
按热度按时间avkwfej41#
你最好的选择是根本不使用Guice进行单元测试。如果你已经做好了准备,你可以在测试中手动使用Guice通常会做的构造函数注入。这样做的好处是只加载和启动你需要的依赖项,而不是整个应用程序。这应该会让事情快得多。
如果您不能做到这一点,那么也许您可以更改JUnit规则,在每个测试上创建注入器(在
beforeEach
中,而不是beforeAll
中)。