]
Scott Marlow commented on JASSIST-205:
--------------------------------------
Potential change is here
that
seems to pass the attached PowerMockDemo.zip test. The proposed change is to save the
number of locals after adding the 'lstore' instruction (in the tail end of
MethodCall.replace(String)).
"VerifyError: Inconsistent stackmap frames" from PowerMock
(using Javassist 3.18)
---------------------------------------------------------------------------------
Key: JASSIST-205
URL:
https://issues.jboss.org/browse/JASSIST-205
Project: Javassist
Issue Type: Bug
Affects Versions: 3.18.0-GA
Environment: jdk1.7.0_21, Win8amd64
Reporter: Ryan Kenney
Assignee: Shigeru Chiba
Attachments: PowerMockDemo.zip, powermockdemoDEBUG.txt, PowerMockTest.class,
PowerMockTest.javap, PowerMockTestCorrectedOffsets.javap, PowerMockTestLatest.javap,
PowerMockTest_jdk8.javap, TEST-PowerMockTest.xml
Apologies if this is a duplicate of JASSIST-204. I didn't delve into the actual
Javassist APIs used, I'm simply seeing an error in my PowerMock usage. Fortunately,
this ticket provides a very simple test case for reproducibility.
I was prompted to open a Javassist ticket by the following PowerMock ticket:
https://code.google.com/p/powermock/issues/detail?id=355
I'm attaching a very simple maven project with a unit test to demonstrate the
problem.
Here are the guts of the failing unit test:
{code}
@RunWith(PowerMockRunner.class)
@PrepareForTest( {MyClassUnderTest.class} )
public class PowerMockTest {
/**************************************************************************
* Demonstrates an "Inconsistent stackmap frames" exception that results
* from PowerMock 1.5 and JDK 7.
*************************************************************************/
@Test
public void testWaitForExitMockMonitors() throws InterruptedException {
resetAll();
Object mockMonitor = createStrictMock(Object.class);
MyClassUnderTest myClass = new MyClassUnderTest(mockMonitor);
mockMonitor.wait(0);
mockMonitor.notifyAll();
replayAll();
myClass .run();
verifyAll();
}
public static class MyClassUnderTest {
private Object m_monitor;
public MyClassUnderTest(Object monitor) {
m_monitor = monitor;
}
public void run() throws InterruptedException {
m_monitor.wait(0);
m_monitor.notifyAll();
}
}
}
{code}
And here is my error:
{code}
java.lang.VerifyError: Inconsistent stackmap frames at branch target 283 in method
com.scea.dart.cmd.targetcontrol.target.process.PowerMockTest.testWaitForExitMockMonitors()V
at offset 274
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2451)
at java.lang.Class.privateGetPublicMethods(Class.java:2571)
at java.lang.Class.getMethods(Class.java:1429)
at
org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.getTestMethods(PowerMockJUnit44RunnerDelegateImpl.java:95)
at
org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.<init>(PowerMockJUnit44RunnerDelegateImpl.java:71)
at
org.powermock.modules.junit4.internal.impl.PowerMockJUnit49RunnerDelegateImpl.<init>(PowerMockJUnit49RunnerDelegateImpl.java:29)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at
org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:143)
at
org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:39)
at
org.powermock.tests.utils.impl.AbstractTestSuiteChunkerImpl.createTestDelegators(AbstractTestSuiteChunkerImpl.java:217)
at
org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.<init>(JUnit4TestSuiteChunkerImpl.java:59)
at
org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.<init>(AbstractCommonPowerMockRunner.java:32)
at org.powermock.modules.junit4.PowerMockRunner.<init>(PowerMockRunner.java:33)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31)
at
org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
at
org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24)
at
org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:33)
at
org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.<init>(JUnit4TestClassReference.java:25)
at
org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:48)
at
org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:38)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
{code}
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: