正如@Brice 所说,PermGen 的问题将来自您对模拟对象的广泛使用。Powermock 和 Mockito 都创建了一个新类,它位于被模拟的类和您的测试代码之间。此类在运行时创建并加载到 PermGen 中,并且(实际上)永远不会恢复。因此,您对 PermGen 空间的问题。
对于你的问题:
1) 共享静态变量被认为是代码异味。在某些情况下这是必要的,但它会在测试之间引入依赖关系。测试 A 需要在测试 B 之前运行。
2)使用静态方法返回一个模拟对象并不是真正的代码味道,它是一种经常使用的模式。如果你真的不能增加你的 permgen 空间,你有很多选择:
使用模拟池,PowerMock#reset()
当模拟放回池中时。这会减少你正在做的创作的数量。
其次,你说你的课程是最终的。如果这是可以更改的,那么您可以在测试中使用匿名类。这再次减少了使用的 permgen 空间量:
Foo myMockObject = new Foo() {
public int getBar() { throw new Exception(); }
}
第三,您可以引入一个接口(在 Eclipse 中使用 Refactor->Extract Interface),然后用一个什么都不做的空类来扩展它。然后,在您的课堂上,您执行与上述类似的操作。我经常使用这种技术,因为我发现它更容易阅读:
public interface Foo {
public int getBar();
}
public class MockFoo implements Foo {
public int getBar() { return 0; }
}
然后在课堂上:
Foo myMockObject = new MockFoo() {
public int getBar() { throw new Exception(); }
}
我不得不承认我不是特别喜欢模拟,我只在必要时使用它,我倾向于使用匿名类扩展类或创建一个真正的 MockXXX 类。有关此观点的更多信息,请参阅模拟模拟和测试结果。鲍勃叔叔
顺便说一句,在 maven surefire 中,您始终可以forkMode=always为每个测试类分叉 jvm。不过,这不会解决您的 Eclipse 问题。