2017-02-07 10 views
2

ユニットテストのデータをモックするには、私はMockitoを使用しています。しかし、私は以下の例外を見る。私はセットアップがありませんか?Mockito&PowerMock - クラスのサイズ制限

ここで使用されるJVMはJava HotSpot(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) 
+0

テストメソッドのコードを追加してください。 –

+0

コードが追加されました。関数呼び出し "mock"はこの例外をスローします。 – user127377

+0

あなたの 'TestObj'クラスはすでに巨大であるか、あるいはそれに多くの機器が入っているかのようです。すべての計測の結果、コンパイルされたコードサイズは、エラーを生成する特定のポイントをオーバーフローします。詳細については、[there](http://www.javaworld.com/article/2073208/reproducing--code-too-large--problem-in-java.html)を参照してください。 –

答えて

1

例外はホルガーはコメントで指摘したように、それは過度に大きな定数プール文句ASMから来ています。これは、既に大規模なクラスにMockitoとPowerMockによって暗示された計測器の両方を適用した結果です。

Javaクラスファイル形式では、クラスによって宣言されたフィールド、メソッドまたは定数の数など、いくつかの制限が設定されます。生成されていないJavaクラスでこの制限を超えると、同様の問題が発生します。

クラスをモックするために、Mockitoは、各スーパーメソッドを呼び出すためのディスパッチャメソッドと合成メソッドを追加するようにByte Buddyに依頼します。これはクラスによるメソッドの量を効果的に倍増させ、定数プールにも追加します。 PowerMockは同様のものを適用します。

すでに一定の限界に近づいていた場合、これらの追加によって最終的にはクラスファイルの表現が可能になります。これは一般に、何千ものセッターとゲッターを含むオブジェクトを持っている場合にのみ起こります。その結果、このオブジェクトをモックできず、特にMockitoとPowerMockの両方がアクティブになります。

関連する問題