【发布时间】:2018-06-27 02:24:14
【问题描述】:
我正在使用 testng 和 Mockito2 为一个项目编写模块测试。我想模拟一些发出出站请求的方法。现在,要模拟的对象是在另一个对象的方法中本地创建的。所以,如果我说 4 个类,A、B、C 和 D,这样 A 创建 B 类型的对象,B 创建 C 类型的对象,依此类推,D 类型的对象要被模拟,我看到我有两个选择来模拟它。
选项 1 是监视 A、B、C 类型的对象,并将 B 的 spy 注入 A 并将 C 注入 B,最后在对象创建期间将 D 的 mock 注入 C。下面是一个例子。
class A {
public B createB()
{
retrun new B();
}
public void someMethod ()
{
B b = createB();
}
}
通过这种方式,我可以在调用 createB 时监视 A 并为 B 注入模拟对象。这样我最终可以模拟 D。
选项 2 是不模拟间歇性课程,而是直接拥有一个工厂课程,如下所示:
class DFactory {
private static D d;
static public void setD (D newD)
{
d = newD;
}
public static D getD()
{
if (d!=null)
{
return d;
} else
{
return new D();
}
}
}
上述选项很简单,但我不确定这是否正确,因为它会创建更多静态方法,我认为应该避免这种情况。
我想知道应该首选哪种方法以及是否有其他替代方法。
请注意,我不希望使用 powermockito 或任何其他鼓励不良代码设计的框架。我想坚持使用mockito2。我可以重构我的代码以使其更具可测试性。
【问题讨论】:
-
推荐你阅读dependency injection的概念。
标签: java unit-testing mockito static-methods testability