【问题标题】:JMockit dynamic partial mock a constructor of the class under testJMockit动态部分模拟被测类的构造函数
【发布时间】:2014-09-09 13:10:35
【问题描述】:

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

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

有人提到,如果我们将ExpectationsClass 对象一起使用,它的所有方法和构造函数以及它的父对象的所有方法和构造函数都将被考虑用于模拟。被嘲笑是什么意思?他们将有资格被模拟并且被模拟,我们需要将它们包含在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,添加了要模拟其构造函数的被测类的示例。

标签: java jmockit


【解决方案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 字段。如果被测类在其他任何地方实例化了依赖项,那么测试仍然是一样的。

【讨论】:

  • 啊,我是如何忽略@Mocked 模拟为相关范围内的类创建的所有实例这一事实超出了我的范围。不过,干杯。不得不说,一个了不起的框架。
猜你喜欢
  • 2013-09-03
  • 2011-06-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-13
  • 2012-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多