因为我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>
答案 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
来自多个类,那将会很麻烦。