gpt4 book ai didi

java - 在 Guice 中访问注入(inject)的依赖项

转载 作者:行者123 更新时间:2023-12-01 22:59:05 25 4
gpt4 key购买 nike

给定一个使用 Guice @Inject 注释注入(inject)依赖项的类,有哪些可能的选项可以从注入(inject)它的类外部获取对此依赖项的引用?

假设我有以下 A 类:

public class A {

@Inject
private B b;

}

假设我想测试 A 类。我编写了一个 JUnit 测试用例:

public class TestA {
@Inject
private A a;

}

在开始测试类 A 的方法之前,我想在测试用例中的 A 实例中设置 B 实例的一些属性。

在我的测试用例中,在获取对已注入(inject)到类 A 中的类 B 实例的引用方面,我有哪些选择?

我可以在 A 类中添加一个 getter 来获取对 B 的注入(inject)实例的引用,并在我的测试用例中调用此 getter。不过,如果类 A 中注入(inject)了 5 个以上的依赖项,我将不得不在 A 中为每个依赖项编写 5 个 getter。

另一个选择是用@Singleton注释类B,这样无论我在哪里访问它,Guice总是给我相同的B实例。尽管如此,仅仅因为我想在测试用例中访问 B 就要求 Guice 将 B 视为单例,这感觉不太对。我可能在 B 类中有一些状态,但我不想在 B 的所有实例之间共享。

是否有比上面列出的更好的选项来获取对 A 中注入(inject)的 B 实例的引用?

编辑请注意,我无法控制 A 的实例化。我们的内部框架中有一个类将实例化 A。

最佳答案

最常见和推荐的单元测试A方法是在测试中完全避免使用Guice。使用您提供的 B 引用创建 A

public class A {

private final B b;

@Inject
public A(B b) {
this.b = b;
}
}

在您的测试代码中,只需创建 B (无论是实际的 B 还是模拟),然后自己创建 A

B b = mock(B.class);
A testUnit = new A(b);
//now you obviously know what b is

如果您确实想在测试中引入 Guice,您可以使用不同的模块配置,在其中控制 B 的实例化方式。由于测试将提供模块和 B 的实例,因此在测试中获取 B 的实例应该很简单。

关于java - 在 Guice 中访问注入(inject)的依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23594581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com