java - 针对现有注入(inject)器测试注入(inject)类的方法

标签 java unit-testing guice

由于遗留代码库,我有一组在运行时注入(inject)的类。我想编写一个单元测试来检查注入(inject)器是否可以满足这些类的所有注入(inject)依赖项。我已经有了要注入(inject)的类的列表,并且我可以在 Stage.TOOL 中实例化注入(inject)器,因为否则它将执行诸如连接到数据库之类的操作。

我的问题是,如何针对注入(inject)器检查这些类?我尝试过 injector.getMembersInjector(classToBeInjected),但是失败了,因为 Stage.TOOL 中的注入(inject)器不支持它。基本上,我不需要注入(inject)器实例,但我需要它来检查是否可以创建它。

作为引用,这是我当前的实现:

@AllArgsConstructor
@RunWith(Parameterized.class)
public class HtmlActionInjectTest {
    @Parameters(name="{1}")
    public static List<Object[]> parameters() {
        return ImmutableList.of(classesUnderTest);
    }

    @BeforeClass
    public static void setUp() {
        injector = Guice.createInjector(Stage.TOOL, myLongListOfModules);
    }

    private static Injector injector;
    private final Class<?> actionClass;

    @Test
    public void test() {
        injector.getMembersInjector(actionClass);
    }
}

我还尝试使用 SPI api,使用 Elements.getElements(myModules),但我无法让它告诉我 classToBeInjected 的依赖项是否存在> 可以满足。

被测类的示例:

public class MyAction implements SomeInterface {
  public MyAction(UnInjectableDependency dep) {
    // can't be injected here for legacy reasons
  }

  @Inject void doInject(SomeDep dep) {
     this.dep = dep;
  }

  @Override void someInterfaceMethod() { /* you get the idea */ }
}

最佳答案

我在同事的帮助下找到了解决方案。

Guice 提供了一个名为 InjectionPoint 的类,它可用于查找要注入(inject)的类的所有依赖项。因此,解决方案如下所示:

@AllArgsConstructor
@RunWith(Parameterized.class)
public class HtmlActionInjectTest {
    @Parameters(name="{1}")
    public static List<Object[]> parameters() {
        return ImmutableList.of(classesUnderTest);
    }

    @BeforeClass
    public static void setUp() {
        bindings = Guice.createInjector(Stage.TOOL, myLongListOfModules).getAllBindings().keySet();
    }

    private static Set<Key<?>> bindings;
    private final Class<?> actionClass;

    @Test
    public void test() {
        for (InjectionPoint point : InjectionPoint.forInstanceMethodsAndFields(actionClass)) {
            for (Dependency<?> dependency : point.getDependencies()) {
                assertTrue("injector cannot satisfy dependency " + dependency.getKey() + " in " + actionClass.getName(), bindings.contains(dependency.getKey()));
            }
        }
    }
}

关于java - 针对现有注入(inject)器测试注入(inject)类的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24735665/

相关文章:

java - 如何用假测试模块替换 Guice 模块进行单元测试?

java - 405 不允许使用删除方法

java - 如何创建以非 Activity 文本作为后缀的 SWT 文本字段?

java - Spring 单元测试 JPA 存储库

python - 直接对 celery 任务进行单元测试

rest - 使用 JAX-RS 的 Guice

java - @JsonProperty 名称带空格

java - 用于分发传感器数据的高效 Java 观察器设计 (~40Hz)

c++ - 如何创建与 OpenSSL C++ 输出相比较的 OpenSSL 输出以生成单元测试?

java - 导入中缺少 Guice 多重绑定(bind)包