【发布时间】:2014-09-09 13:10:35
【问题描述】:
所以我阅读了this 文档以了解JMockit 如何支持类的动态部分模拟。
如上图,
NonStrictExpectations(Object...)构造函数 接受一个或多个类或对象进行部分模拟。 (这Expectations(Object...)也是如此,它允许严格 对部分模拟类型的期望。)如果给出了 Class 对象, 该类中定义的方法和构造函数被考虑用于 模拟,以及它的超类的方法和构造函数; 指定类的所有实例都将被视为已模拟 实例。另一方面,如果给出一个正则实例,那么 只考虑类层次结构中的方法,而不是构造函数 用于嘲笑;更重要的是,只有那个特定的实例会被模拟。
有人提到,如果我们将Expectations 与Class 对象一起使用,它的所有方法和构造函数以及它的父对象的所有方法和构造函数都将被考虑用于模拟。被嘲笑是什么意思?他们将有资格被模拟并且被模拟,我们需要将它们包含在new Expectations(...) 块中(我希望是这样,毕竟这是部分模拟)?
此外,没有提到如何动态地部分模拟类的构造函数并按照我想要的方式进行初始化——在我的例子中,它是被测试的类。当然,这不是我在MockUp 实现中使用的$init?我不认为@Tested、@Injectable 组合会起作用,我没有一个带参数来初始化所有实例变量的构造函数。
当然我可以构建一个构造函数来满足单元测试的需要,但是添加这样的代码正是我想要避免的。
我将如何做这件事的任何例子?
编辑:我要模拟的类的原型:
class Sample
{
Dependency dep;
// the constructor i'd like to mock out and set the dependencies (dep) myself
public Sample()
{
dep = new Dependency("i'm a nuisance");
}
// method to be tested
void doSomethingWithTheDependency()
{
// does a few things using dep
System.out.println(dep.getId());
}
}
如果我可以模拟构造函数来自己设置dep,那将对我有很大帮助。当然,这是一个典型的案例示例,如果我“注入”依赖项而不是像那样实例化,那么处理起来会容易得多,但是 IMO 在这里的这种“注入”只有 em> 辅助测试,仅此而已。这就是为什么我要模拟 Sample 类的构造函数。
【问题讨论】:
-
我认为您需要展示一个正在测试的类的示例,该类的构造函数将被模拟。否则,很难看出问题到底是什么。
-
@Rogério,添加了要模拟其构造函数的被测类的示例。