Метод выдал слишком большую ошибку во время PowerMockito

#java #aws-lambda #jvm #mockito #powermockito

#java #aws-lambda #jvm #mockito #powermockito

Вопрос:

Java-код этой лямбда-функции AWS скомпилирован без каких-либо проблем. Но при выполнении модульного тестирования с использованием PowerMockito начинает появляться ошибка, когда мы добавляем основной класс в @PrepareForTest, из родительских методов вызывается несколько методов. Я попробовал издеваться над несколькими методами, используя PowerMockito. Но все равно размер метода превышает исключение.

Java-код

 Public class ClassA implements RequestHandler<InputPayLoadPojo, Response> {

        Public Response handleRequest(InputPayLoadPojo, Context) {
                Private ReturnType ChildMethod1()     {
               …..     
               }
                Private ReturnType ChildMethod2 ()    {
                       Private ReturnType SubChildMethod2 (){
                       ……..
                       }
               …..     
               }

                Public ReturnType ChildMethod1 ()     {
               …..     
               }

               .
               .
               .
               .

               Private ReturnType ChildMethod18 ()   {
               …..     
               }


        }

}
  

Тестовый класс

 @RunWith(PowerMockRunner.class)
@PowerMockIgnore({ "javax.net.ssl.*" , "javax.management.*"})
@PrepareForTest({ ClassA.class})
public class SynchronousTest {

        ClassA obj = PowerMockito.spy(new ClassA());
@Test
public void testSynchronousTranslation() {

        doReturn(somevalue).when(obj, “ChildMethod1”, anyObject….);
        doReturn(somevalue).when(obj, “ChildMethod2”, anyObject….);
        doReturn(somevalue).when(obj, “ChildMethod3”, anyObject….);

        obj.handleRequest(someInputPayLoadPojoObject, someContextObject);

}

}
  

Ошибка получения:

 java.lang.IllegalAccessException: Method was too large and after instrumentation exceeded JVM limit. PowerMock modified the method to allow JVM to load the class. You can use PowerMock API to suppress or mock this method behaviour.
        at com.taas.amazonservices.lambda.TaaSSyncLambdaFunctionHandler.handleRequest(TaaSSyncLambdaFunctionHandler.java)
        at taas.amazonservices.lambda.SynchronousTest.testSynchronousTranslation(SynchronousTest.java:165)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68)
        at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:326)
        at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:89)
        at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:97)
        at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:310)
        at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:131)
        at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.access$100(PowerMockJUnit47RunnerDelegateImpl.java:59)
        at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner$TestExecutorStatement.evaluate(PowerMockJUnit47RunnerDelegateImpl.java:147)
        at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.evaluateStatement(PowerMockJUnit47RunnerDelegateImpl.java:107)
        at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82)
        at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:298)
        at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:87)
        at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:50)
        at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:218)
        at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:160)
        at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:134)
        at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34)
        at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44)
        at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:136)
        at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:121)
        at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:57)
        at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59)
        at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
        at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
        at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
        at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
        at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)
  

Комментарии:

1. Ваш метод был слишком сложным, после инструментирования его размер байт-кода превысил ~ 64 КБ

2. Если я буду издеваться над всеми методами, кроме одного, который я хочу протестировать, решит ли это эту проблему. Я пытаюсь высмеять все методы и проверить, решена ли эта проблема.

3. Также я не смог понять, почему это появляется при вызове в модульном тестировании. Но во время компиляции java эта проблема не появляется.