Java 针对现有喷油器的喷油等级测试方法

Java 针对现有喷油器的喷油等级测试方法,java,unit-testing,guice,Java,Unit Testing,Guice,我有一组在运行时注入的类,因为有一个遗留代码库。我想写一个单元测试,检查注入器是否能够满足这些类的所有注入依赖项。我已经有了要注入的类的列表,我可以在Stage.TOOL中实例化注入器,因为否则它将执行连接到数据库之类的操作 我的问题是,如何对照喷油器检查这些类?我已尝试injector.GetMembersInjector或ClassToBeinjected,但此操作失败,因为Stage.TOOL中的injector不支持它。基本上,我不需要injector实例,但我需要它来检查是否可以创建它

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

我的问题是,如何对照喷油器检查这些类?我已尝试injector.GetMembersInjector或ClassToBeinjected,但此操作失败,因为Stage.TOOL中的injector不支持它。基本上,我不需要injector实例,但我需要它来检查是否可以创建它

以下是我当前的实现,以供参考:

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

我在一位同事的帮助下找到了解决办法

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()));
            }
        }
    }
}
您应该使用Stage.DEVELOPMENT而不是os Stage.TOOL。工具是为了我们在一个工具中运行,例如IDE插件。
@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()));
            }
        }
    }
}