测试方法针对现有喷射器注入类

时间:2014-07-14 11:36:41

标签: java unit-testing guice

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

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

供参考,这是我目前的实施:

@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);
    }
}

我也尝试过使用{apis,使用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 */ }
}

1 个答案:

答案 0 :(得分:0)

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

Guice提供了一个名为InjectionPoint的类,可用于查找要注入的类的所有依赖项。所以,解决方案看起来像这样:

@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()));
            }
        }
    }
}