如何模拟最终字段?的Mockito/powermock

gst*_*low 6 testing junit unit-testing mockito powermock

我有同一个班级

class MyCalss{
     final static SomeClass field  = new SomeClass();
     ...
}
Run Code Online (Sandbox Code Playgroud)

我应该模拟MyCalss的实例.这个模拟应该包含像真实对象的字段.

我怎样才能实现它?

Jef*_*ica 5

Mocking 操作方法接口,而不是字段;此外,它对实例成员进行操作,而不是对静态成员进行操作。Mockito 和 Powermock 不是解决这个问题的正确工具。

虽然您可以使用反射来设置最终字段,但您正在有效地处理自己的声明,并受到JLS 17.5.3的限制和危害。

更好的设计是在被测系统中重写方法以注入其 SomeClass 依赖项:

public void methodUnderTest() {
  methodUnderTest(MyClass.field);
}

/** Package-visible for testing. Test this method instead. */
void methodUnderTest(SomeClass someClass) {
  someClass.firePhotonTorpedoes();
}
Run Code Online (Sandbox Code Playgroud)


Joh*_*n B 1

您可以使用允许模拟调用构造函数的框架,例如 JMockit 或 Powermock。

动力模拟

JMockit