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

时间:2017-04-19 11:30:06

标签: java junit log4j jmockit

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

@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;
        }
    };
}

我使用jMockit v 1.31与JUnit 4.12和Maven 3.x.

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

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

我认为这是因为之前GregorianCalendar没有覆盖该方法。但是,我认为假的是在测试类之后自动删除的!这是一个错误吗?

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

1 个答案:

答案 0 :(得分:0)

我已经使用了一种解决方法,我只用一行代码在测试类中创建了一个方法

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

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

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

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

但是,这只是一种解决方法。如果调用Calendar来自多个类,那将会很麻烦。