1

我想使用 JMockit 模拟以下类:

public class A {

    private int n;

    public A(int n) {
        this.n = n;
    }

    public boolean isCorrect() {
        return n % 2 == 0;
    }
}

该类在我的代码中进行了初始化,并且我通常无法访问我的测试中的那部分代码。
在我的一些测试中,我想模拟它,以便如果使用值 3 初始化类,'isCorrect' 将返回 true(这不是正常行为),而在其他一些测试中,我想模拟它以便'isCorrect' 无论如何初始化都将返回 false。

我试图在文档中找到一种方法,但它不是那么用户友好,我放弃了它。

4

2 回答 2

5

对于您的第一种情况,您可以执行以下操作:

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; }并且您不再需要反射。

于 2013-08-12T13:53:22.003 回答
-3

感谢@assylias 的回答。我想我找到了一种更好的方法来实现第一个模拟,它结合了你的第一个和第二个(编辑后)答案的想法。它是这样的:

new MockUp<A> () {

    private int n;

    @Mock
    public void $init(Invocation inv, int n) {
        this.n = n;
        inv.proceed();
    }

    @Mock
    public boolean isCorrect(Invocation inv) {
        if (n == 3) {
            return true;
        }
        return inv.proceed();
    }
};

更新

对于第二个模拟(粗暴的错误返回),这将是:

new MockUp<A> () {

    @Mock
    public boolean isCorrect() {
        return false;
    }
};

再次感谢@assylias 帮助我解决这个问题:)

于 2013-08-12T15:00:47.217 回答