Mockit - 这段代码是否超出了代码中的所有实例?

时间:2017-10-31 20:00:41

标签: java jmockit

我正在查看以下代码

import mockit.Mock;
import mockit.MockUp;
new MockUp<Fubar>() {
    @Mock
    delete(final String fooId) {        
        assertEquals(fooId, "foo123");
    }
};

我注意到这没有分配给任何变量。我猜不到(并且我在某处读到类加载器)这导致Fubar的每个实例都被这个模拟方法删除定义,即使它在其他地方被实例化。 (我猜这种情况会发生在时间上并不重要?)Mockit有什么东西和Mockito不同吗?我在现有代码中不止一次看过这种模式,所以我不认为这是一个错字。

编辑:请不要在没有解释原因的情况下对此进行投票。这是一个合法的问题,我已经花了很多时间尝试研究。

编辑:没有一个帖子讨论了代码的可能意图,而是讨论我未能确定使用的模拟框架。

1 个答案:

答案 0 :(得分:1)

它重新定义了Fubar中的delete方法,以包含模拟版本。这会影响在每次测试结束时恢复原始文件之后创建的所有实例。这是可能的,因为它使用自己的Java代理,允许在程序运行时重新定义类。

例如:

import mockit.Mock;
import mockit.MockUp;

class Fubar {
    public void delete(String fooId) {
        System.out.println("Called real");
    }
}

public class Main {
    public static void main(String[] args) throws Exception {
        new MockUp<Fubar>() {
            @Mock
            void delete(final String fooId) {
                System.out.println("Called mock");
            }
        };

        new Fubar().delete("foo123");
    }
}

输出为:&#34;称为模拟&#34;