C. *_*oss 16 java android powermock robolectric
我正在尝试使用PowerMockito来模拟Android Robolectric测试中的一些静态方法.我按照这里的指示使用JUnit 4.8.2,Robolectric 2.2,Mockito 1.9.5和PowerMock 1.9.5 .因为我必须使用RoboElectricTestRunner,所以我试图使用PowerMockRule来引导PowerMock.但是,java.lang.IncompatibleClassChangeError
当PowerMock的测试运行时,我很不幸.
Sun.reflect.DeativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)at
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)的java.lang.reflect.InvocationTargetException
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)引发者:java.lang.IncompatibleClassChangeError:
在java.lang.ClassLoader.defineClass(ClassLoader.java)java.lang.ClassLoader.defineClassCond(ClassLoader.java:637)的java.lang.ClassLoader.defineClass1(Native Method)中实现类:621)at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
如果我把图书馆放到org.ow2.asm
后面,org.powermock
我得到:
java.lang.IncompatibleClassChangeError:class org.objectweb.asm.tree.ClassNode在java.lang.ClassLoader.defineClassCond(ClassLoader)的java.lang.ClassLoader.defineClass1(Native Method)中将接口org.objectweb.asm.ClassVisitor作为超类.java:637)java.lang.ClassLoader.defineClass(ClassLoader.java:621),位于java.net.URLClassLoader.defineClass(URLClassLoader.java:283)java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) 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依赖性:树Robolectric和PowerMock不共享任何依赖.但显然org.powermock:powermock-module-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());
}
}
Run Code Online (Sandbox Code Playgroud)
我找到了一种将PowerMock与Robolectric结合使用的方法.
除了标准的PowerMock jar之外,还需要PowerMock Junit规则.这里描述了如何抓住它.我使用了xstream
类加载版本,因为那个版本objenesis
非常多.这与PowerMock 1.5.5和Robolectric 2.3一起使用,我不能谈论旧版本.另请注意,不应包含Java代理,因为根据我的经验,它会导致问题.
因此,如果您使用maven,则应声明这些依赖项:
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4-rule</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-classloading-xstream</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)
然后你必须像这样设置你的测试类:
@RunWith(RobolectricTestRunner.class)
@PowerMockIgnore({ "org.mockito.*", "org.robolectric.*", "android.*" })
@PrepareForTest(Static.class)
public class MyTest {
@Rule
public PowerMockRule rule = new PowerMockRule();
private MyActivity activity;
@Before
public void setup() {
activity = Robolectric.buildActivity(MyActivity.class).create().get();
}
@Test
public void test() throws Exception {
PowerMockito.mockStatic(Static.class);
Mockito.when(Static.getCurrentTime()).thenReturn(1);
Assert.assertEquals(1, activity.getId());
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5820 次 |
最近记录: |