我正在使用powermock测试和Android活动
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21)
@PowerMockIgnore({ "org.mockito.*", "org.robolectric.*", "android.*"})
@PrepareForTest(EpicDetailFragment.class)
public class ITestActivityTest {
private ITestDemoActivity activity;
private FragmentManager fm;
@Rule
public PowerMockRule rule = new PowerMockRule();
@Before
public void initSetup(){
activity = Robolectric.buildActivity(IGDemoActivity.class).create().get();
fm = activity.getSupportFragmentManager();
assertTrue(activity != null);
}
}
无论如何,我得到以下链接错误
java.lang.LinkageError: loader constraint violation: when resolving method "android.support.v4.app.FragmentTransaction.add(ILandroid/support/v4/app/Fragment;Ljava/lang/String;)Landroid/support/v4/app/FragmentTransaction;" the class loader (instance of org/powermock/core/classloader/MockClassLoader) of the current class, com/pips/ftse/igdemo/activities/IGDemoActivity, and the class loader (instance of org/robolectric/internal/bytecode/InstrumentingClassLoader) for the method's defining class, android/support/v4/app/FragmentTransaction, have different Class objects for the type android/support/v4/app/Fragment used in the signature
你知道这是怎么回事吗?怎么解决?
我以为忽略android.*
可能会起作用,但它不起作用。
这个错误意味着,一个类及其父类由不同的类加载器加载。当从子类实例调用超类中的方法时,由于类对象实例不同,无法链接(使用)该方法。
您有这个错误,因为"android.*"被添加到@PowerMockIgnore
中,但您正在尝试准备测试类EpicDetailFragment
,它显然扩展了android.support.v4.app.FragmentTransaction
。
该怎么办?尝试从忽略中删除"android.*",并尝试使用更具体的路径来忽略无法通过PowerMock重新加载的android部分。此外,我建议尝试使用@PowerMockRunnerDelegate
,而不是使用规则。