如何删除抽象方法的 jMockit Fake/MockUp?

How to remove jMockit Fake/MockUp for abstract method?

因为我 can't fake an abstract class directly 并且我知道实现 class,所以我在实现 class 中添加了伪造的 class。

@BeforeClass
public static void fakeCurrentYear() {
    // Mocking the abstract 'Calender' does not work, see: https://github.com/jmockit/jmockit1/issues/71
    // So we use the implementing class 'GregorianCalendar'.
    new MockUp<GregorianCalendar>() {

        @Mock public int get(Invocation invocation, int field) {
            return 2016;
        }
    };
}

我在 JUnit 4.12 和 Maven 中使用 jMockit v 1.31 3.x。

当我单独执行测试时,一切都很好。

但是当我一起执行所有测试时,另一个测试失败了,因为实现中的 log4jlogger class 显然使用了假实现。

我想这是因为之前GregorianCalendar没有覆盖那个方法。不过我还以为假的是测试后自动去掉的class!这是一个错误吗?

我可以手动删除它吗?我尝试退回到 JMockit v1.25,创建了一个静态变量 yearMock = new MockUp<GregorianCalendar>() ... 并在 @AfterClass 方法中调用了 yearMock.tearDown(),但它没有改变任何东西。

我使用了一个变通方法,我在 class 测试中创建了一个方法,只用了一行代码

private int currentYear4digits() {
    return Calendar.getInstance().get(Calendar.YEAR);
}

在我的测试中,我嘲笑了这个方法。

@BeforeClass
public static void fakeCurrentYear() {
    new MockUp<MyClass>() {

        @Mock 
        public int currentYear4digits() {
            return 2016;
        }
    };
}

但是,这只是一种解决方法。如果对 Calendar 的调用来自多个 classes.

会很麻烦