对于您的第一种情况,您可以执行以下操作:
new MockUp<A> () {
private int n;
@Mock public void $init(int n) { this.n = n; }
@Mock public boolean isCorrect() { return n == 3; }
};
对于您的第二个示例:
new MockUp<A> () {
@Mock public boolean isCorrect() { return false; }
};
例如,这会打印 false、true、false、false:
new MockUp<A> () {
private int n;
@Mock public void $init(int n) { this.n = n; }
@Mock public boolean isCorrect() { return n == 3; }
};
System.out.println(new A(2).isCorrect());
System.out.println(new A(3).isCorrect());
new MockUp<A> () {
@Mock public boolean isCorrect() { return false; }
};
System.out.println(new A(2).isCorrect());
System.out.println(new A(3).isCorrect());
编辑
根据您的评论,仅针对某些 n 值模拟类的一种方法是使用反射来检查字段的值:
new MockUp<A> () {
@Mock public boolean isCorrect(Invocation invocation) {
// Gets the invoked instance.
A a = invocation.getInvokedInstance();
int n = Deencapsulation.getField(a, "n");
if (n == 3) return true;
else return a.isCorrect();
}
};
但它变得有点脆弱,因为它取决于 A 类中变量的名称。
一个更好的选择可能是在您的 A 类中提供一个受包保护的 getter 用于测试目的:int getN() { return n; }
并且您不再需要反射。