如何删除抽象方法的 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.
会很麻烦
因为我 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.