JMockit动态部分模拟正在测试的类的构造函数

时间:2014-09-09 13:10:36

标签: java jmockit

所以我阅读了this文档,了解JMockit如何支持对类的动态部分模拟。

  

如上所示,NonStrictExpectations(Object...)构造函数   接受一个或多个要被部分模拟的类或对象。 (该   与Expectations(Object...)相同,允许严格   对部分模拟类型的期望。)如果给出了Class对象,   考虑该类中定义的方法和构造函数   模拟,以及超类的方法和构造;   指定类的所有实例都将被视为模拟   实例。另一方面,如果给出常规实例,那么   只考虑类层次结构中的方法,而不是构造函数   嘲笑;更重要的是,只有那个特定的实例才会被嘲笑。

有人提到如果我们将ExpectationsClass对象一起使用,那么它的所有方法和构造函数以及它们的父对象都将被考虑用于模拟。什么被“考虑”嘲笑意味着什么?他们将有资格进行嘲笑,并且他们被嘲笑,我们需要将它们封装在new Expectations(...)区块中(我希望情况如此,毕竟它是部分嘲弄的)?

另外,没有提到如何动态地部分模拟类的构造函数并进行我想要的初始化 - 在我的例子中它是被测试的类。当然,这不是我在$init实施中使用的MockUp吗?我认为@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只会 援助测试,没有别的。这就是为什么我要模仿Sample类的构造函数。

1 个答案:

答案 0 :(得分:1)

这个例子很容易处理:

@Test
public void mockInternalDependency(@Mocked final Dependency anyDep)
{
    new NonStrictExpectations() {{ anyDep.getId(); result = "test"; }};

    new Sample().doSomethingWithTheDependency();

    new Verifications() {{
        // verify invocations to "anyDep" here, if needed
    }};
}

如您所见,无需担心Sample或其dep字段的构造函数。如果被测试的类在其他任何地方实例化了依赖项,那么测试仍然是相同的。