Java 莫基托;PowerMock-类大小限制
为了模拟用于单元测试的数据,我使用Mockito。但我看到以下例外。我是否缺少任何设置 这里使用的JVM是JavaHotSpot(TM)64位服务器VM。1.8Java 莫基托;PowerMock-类大小限制,java,unit-testing,mockito,byte-buddy,Java,Unit Testing,Mockito,Byte Buddy,为了模拟用于单元测试的数据,我使用Mockito。但我看到以下例外。我是否缺少任何设置 这里使用的JVM是JavaHotSpot(TM)64位服务器VM。1.8 public class TestCreateObj{ public void getMockData() { TestObj deal = mock(TestObj.class); when(deal.getDescription()).thenReturn("HURRAH!!!"); S
public class TestCreateObj{
public void getMockData() {
TestObj deal = mock(TestObj.class);
when(deal.getDescription()).thenReturn("HURRAH!!!");
System.out.println(deal.getDescription());
}
public static void main(String args[]) {
new TestCreateObj().getMockData();
}
此异常在运行时引发:
Caused by: java.lang.RuntimeException: Class file too large!
at net.bytebuddy.jar.asm.ClassWriter.toByteArray(Unknown Source)
at net.bytebuddy.dynamic.scaffold.TypeWriter$Default$ForCreation.create(TypeWriter.java:4108)
at net.bytebuddy.dynamic.scaffold.TypeWriter$Default.make(TypeWriter.java:1612)
at net.bytebuddy.dynamic.scaffold.subclass.SubclassDynamicTypeBuilder.make(SubclassDynamicTypeBuilder.java:174)
at net.bytebuddy.dynamic.scaffold.subclass.SubclassDynamicTypeBuilder.make(SubclassDynamicTypeBuilder.java:155)
at net.bytebuddy.dynamic.DynamicType$Builder$AbstractBase.make(DynamicType.java:2560)
at net.bytebuddy.dynamic.DynamicType$Builder$AbstractBase$Delegator.make(DynamicType.java:2662)
at org.mockito.internal.creation.bytebuddy.SubclassBytecodeGenerator.mockClass(SubclassBytecodeGenerator.java:94)
at org.mockito.internal.creation.bytebuddy.TypeCachingBytecodeGenerator$1.call(TypeCachingBytecodeGenerator.java:37)
at org.mockito.internal.creation.bytebuddy.TypeCachingBytecodeGenerator$1.call(TypeCachingBytecodeGenerator.java:34)
at net.bytebuddy.TypeCache.findOrInsert(TypeCache.java:138)
at net.bytebuddy.TypeCache$WithInlineExpunction.findOrInsert(TypeCache.java:346)
at net.bytebuddy.TypeCache.findOrInsert(TypeCache.java:161)
at net.bytebuddy.TypeCache$WithInlineExpunction.findOrInsert(TypeCache.java:355)
at org.mockito.internal.creation.bytebuddy.TypeCachingBytecodeGenerator.mockClass(TypeCachingBytecodeGenerator.java:32)
at org.mockito.internal.creation.bytebuddy.SubclassByteBuddyMockMaker.createMockType(SubclassByteBuddyMockMaker.java:71)
at org.mockito.internal.creation.bytebuddy.SubclassByteBuddyMockMaker.createMock(SubclassByteBuddyMockMaker.java:42)
at org.mockito.internal.creation.bytebuddy.ByteBuddyMockMaker.createMock(ByteBuddyMockMaker.java:26)
at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:35)
at org.mockito.internal.MockitoCore.mock(MockitoCore.java:65)
at org.mockito.Mockito.mock(Mockito.java:1691)
at org.mockito.Mockito.mock(Mockito.java:1604)
ASM是个例外,它抱怨过大的常量池,正如霍尔格在评论中指出的那样。这是在一个已经很大的类上应用Mockito和PowerMock所暗示的插装的结果 Java类文件格式设置了一些限制,例如类声明的字段、方法或常量的数量。如果在未生成的Java类中超过此限制,将产生类似的问题 为了模拟一个类,Mockito要求Byte Buddy添加调度程序方法和合成方法来调用每个超级方法。这有效地将一个类的方法数量增加了一倍,并将其添加到常量池中。PowerMock应用了类似的功能
如果您已经接近常量限制,那么这些添加最终会将您推到类文件可以表示的边缘。通常,只有当您的对象只包含几千个setter和getter时,才会发生这种情况,结果是您无法模拟此对象,特别是在Mockito和PowerMock都处于活动状态时。请添加添加的测试方法代码的代码。函数调用“mock”引发此异常。您的
TestObj
类似乎已经很大了,或者已经进行了大量的检测。作为所有检测的结果,编译后的代码大小会溢出某个点,从而产生错误。有关更多详细信息,请参阅。Mock认为您没有违反正确设计模式的God对象。显然,当池中的常量太多时,Bytebuddy会抛出此异常,尽管此异常消息具有误导性。