使用Mockito模拟Java3D的好方法是什么?

时间:2011-02-21 15:28:31

标签: mocking javafx mockito java-3d jmonkeyengine

我正在尝试模拟Java3D类进行单元测试,例如:

mock(VirtualUniverse.class);

mock(Canvas3D.class);

不幸的是,VirtualUniverse(也被Canvas3D引用)具有对MasterControl的静态引用,其中包含一个方法

static void loadLibraries(){
...
}

在模拟期间调用并尝试加载外部库,这正是我想要避免的。

我想听听人们使用什么作为模拟的一般方法应用于使用Java3D框架的应用程序,特别是如果你找到了一个令人满意的方法来处理Universes。

更新

提出这个问题之后发生了几件事。一个是我们更多地了解了Java3D和JavaFX的状态。似乎Java3D的工作目前正在停止,有利于专注于JavaFX。此外,JavaFX目前将在2011年第3季度包含Java API。由于我们现有的代码是基于场景图的,所以我四处寻找其他场景图谱范例工具,偶然发现了jMonkeyEngine(jME),它们似乎对我们有用。

虽然jME的应用程序类更喜欢继承而不是组合(参见com.jme3.app.SimpleApplication),但是很容易将委托者插入到继承层次结构中,这使我能够以更加TDD的方式创建自己的应用程序。此外,jME团队一直很好地避免使用静态行为,这再次有助于模拟UT的组件。

所以,我接受了Zsolt的答案,理由是他和代表团一起考虑了钱。

1 个答案:

答案 0 :(得分:1)

我担心你的问题没有答案。如果你想在测试期间避免意外的静态调用 - 它不依赖于你正在使用的模拟框架 - 你可以将你的调用包裹到VirtualUniverse

例如:

public class VirtualUniverseWrapper {
  private VirtualUniverse virtualUniverse;
  // ...
  public Object foo() {
    // simple delegation instead of inheritance, because your class might be final
    return virtualUniverse.foo();
  }
}

如果你使用VirtualUniverseWrapper,你可以嘲笑它。它可能会使你的代码有点奇怪,但它的工作原理。我们在代码库中使用相同的方法将包装器与工厂结合起来。