Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 莫基托;PowerMock-类大小限制_Java_Unit Testing_Mockito_Byte Buddy - Fatal编程技术网

Java 莫基托;PowerMock-类大小限制

Java 莫基托;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

为了模拟用于单元测试的数据,我使用Mockito。但我看到以下例外。我是否缺少任何设置

这里使用的JVM是JavaHotSpot(TM)64位服务器VM。1.8

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会抛出此异常,尽管此异常消息具有误导性。