我正在尝试模拟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的答案,理由是他和代表团一起考虑了钱。
答案 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
,你可以嘲笑它。它可能会使你的代码有点奇怪,但它的工作原理。我们在代码库中使用相同的方法将包装器与工厂结合起来。