跨TestSuite测试保留java Mockito调用impl
我有一个JUnit测试套件,有大约800个测试。其中大部分都与Spring连接,大量使用Mockito来模拟/监视行为。我开始遇到内存不足的错误。在分析hprof转储时,我注意到>;堆的30%被保留在测试之间的Mockito调用占用
在测试类完成后,是否有办法清除这些内容?我不想使用Mockito。重置(模拟),因为模拟初始化随每个测试而变化。如果没有,我似乎需要将测试分开以适应泄漏
从this link看来,Mockito团队认识到,这些保留是执行后验证方法的一种折衷。但是我想知道是否有人找到了一种方法来清除这些代码,这样大量的单元测试就可以在一个套件中串联在一起了
# 1 楼答案
我找到了一份局部工作。在我的例子中,绝大多数
InvocationImpl
实例都是在单个测试用例中创建的,该测试用例使用spy()
创建一个真正的部分模拟,因此可以重写一个方法。我使用的是mockito1.10.19,所以我将部分mock结构从spy()
切换到了mock( <class>, withSettings().spiedInstance( realInstance ).defaultAnswer( CALLS_READ_MATHODS ).stubOnly() )
虽然这样可以防止在这个mock上使用
verify()
,但是stubOnly()
可以防止mock为测试期间对spy的每次调用存储InvocationImpl
的实例,并显著减少堆的使用由于我的mock通常是在Spring上下文文件中使用Springockito创建的,因此我需要对bean定义进行一次难看的修改,以匹配
mock()
调用,如下所示。但这允许spy在Spring wired域类中使用