1

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

mock(VirtualUniverse.class);

或者

mock(Canvas3D.class);

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

static void loadLibraries(){
...
}

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

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

更新:

问了这个问题后发生了几件事。一是我们更多地了解了 Java3D 和 JavaFX 的状态。Java3D 的工作似乎暂时停止,转而专注于 JavaFX。此外,此时 JavaFX 计划在 2011 年第三季度包含 Java API。由于我们现有的代码是基于场景图的,我四处寻找其他场景图范例工具,偶然发现了 jMonkeyEngine (jME),它似乎对我们很有效。

虽然 jME 的应用程序类更喜欢继承而不是组合(参见 com.jme3.app.SimpleApplication),但将委托器插入继承层次结构很容易,允许我以更支持 TDD 的方式创建我们自己的应用程序。此外,jME 团队在避免使用静态行为方面做得很好,这再次有助于为 UT 模拟组件。

因此,我接受 Zsolt 的回答是因为他认为代表团认为他有钱。

4

1 回答 1

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,你可以模拟它。它可能会使您的代码有点奇怪,但它确实有效。我们在代码库中使用相同的方法将包装器与工厂结合起来。

于 2011-02-23T23:08:57.203 回答