私はAndroid Robolectricテストでいくつかの静的メソッドをモックするためにPowerMockitoを使用しようとしています。私は、JUnit 4.8.2、Robolectric 2.2、Mockito 1.9.5、およびPowerMock 1.9.5を指示通りhereとして使用しています。 RoboElectricTestRunnerを使用する必要があるため、PowerMockRuleを使用してPowerMockをブートしようとしています。しかし、PowerMockを使ったテストが実行されると、私は残念なことにjava.lang.IncompatibleClassChangeError
になります。PowerMockとRobolectricを使用する - IncompatibleClassChangeError
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597)
at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:323) at sun.instrument.InstrumentationImpl.loadClassAndCallAgentmain(InstrumentationImpl.java:348)Caused by: java.lang.IncompatibleClassChangeError: Implementing class at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:637) at java.lang.ClassLoader.defineClass(ClassLoader.java:621) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
私は私が手org.powermock
ライブラリの後org.ow2.asm
を置く場合:上
java.lang.IncompatibleClassChangeError: class org.objectweb.asm.tree.ClassNode has interface org.objectweb.asm.ClassVisitor as super class at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(ClassLoader.java:637) at java.lang.ClassLoader.defineClass(ClassLoader.java:621) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) at java.net.URLClassLoader.defineClass(URLClassLoader.java:283) at java.net.URLClassLoader.access$000(URLClassLoader.java:58) at java.net.URLClassLoader$1.run(URLClassLoader.java:197) at java.security.AccessController.doPrivileged(Native Method)
すべてのユニットテスト。
Maven depencyによると、ツリーRobolectricとPowerMockは依存関係を共有しません。 しかし明らかorg.powermock:powermockモジュール-javaagentパッケージいくつかのORG/ObjectWebの/ ASMクラス、およびRobolectricはorg.ow2.asmに依存しています:ASMます。jar:4.1競合の原因。
@RunWith(RobolectricTestRunner.class)
@PrepareForTest(Helper.class)
@PowerMockIgnore({"com.sun.jmx.*", "javax.management.*"})
public class HelpFragTest {
@Rule
public PowerMockRule rule = new PowerMockRule();
static {
PowerMockAgent.initializeIfNeeded();
}
FragmentActivity fragmentActivity;
FragmentManager fragmentManager;
ActionBarManager actionBarManager;
@Before
public void setup(){
actionBarManager = mock(ActionBarManager.class);
LowesApplication.instance().setActionBarManager(actionBarManager);
fragmentActivity = Robolectric.buildActivity(FragmentActivity.class).create().start().resume().get();
fragmentManager = fragmentActivity.getSupportFragmentManager();
}
@Test
public void testShow(){
mockStatic(Helper.class);
HelpFrag helpFrag = HelpFrag.newInstance();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(helpFrag, null);
fragmentTransaction.commit();
assertTrue(helpFrag.isVisible());
}
}
パワーモックランナー。だからRobolectricテストランナーで実行しようとすると意味がありません –
@EugenMartynovそれはjavaagentと 'PowerMockRule'が解決しようとしている問題です。[PowerMockRule](http://code.google.com/ p/powermock/wiki/PowerMockRule)と[PowerMockAgent](http://code.google.com/p/powermock/wiki/PowerMockAgent)を参照してください。 –
これは私たちのためにも問題であるので、あなたがそれを解決すれば、私に知らせてください。 –