当前位置: 首页 > 知识库问答 >
问题:

使用PowerMock和Robolectric-IncompatibleClassChangeError

胡天佑
2023-03-14

我正在尝试使用PowerMockito来模拟Android Robolectric测试中的一些静态方法。我使用的是JUnit 4.8.2、Robolectric2.2、Mockito 1.9.5和PowerMock 1.9.5。由于我必须使用RoboElectricTestRunner,所以我尝试使用PowerMockRule来引导PowerMock。然而,当使用PowerMock运行测试时,不幸的是我得到了java.lang.IncompatibleClassChangeError

@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());
    }
}

共有1个答案

景河
2023-03-14

因此,如果您使用的是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>

那么您必须这样设置您的测试类:

@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());
    }
}
 类似资料:
  • null 模拟UI元素的Robolectric 逻辑测试的单元测试 静态方法mock的PowerMock Robolectric+PowerMock集成问题已知,解决方案也已知--https://github.com/Robolectric/Robolectric/wiki/using-powerMock ,但使用此解决方案时,dagger2依赖项失败。 注意代码。 我的自定义视图: Progre

  • 斯波克行为怪异

  • 我遵循了这里的说明: null 我认为,问题出在下面这一行: 但是,如果删除这一行,尽管@PrepareForTest行不变,但会出现以下错误:

  • 问题内容: 我有以下要模拟的Logger,但要验证是否正在调用日志条目,而不是内容。 我想模拟用于LoggerFactory.getLogger()的任何类,但是我找不到如何做到这一点。到目前为止,这是我最终得到的结果: 我想知道: 我可以模拟静态模型以用于任何课程吗? 我只能似乎运行的,因此我似乎无法改变每个方法的特点。有没有解决的办法? 编辑结果: 我以为我已经尝试过了,但没有成功: 但是,谢

  • Robolectric 是一款Android单元测试框架,示例代码: @RunWith(RobolectricTestRunner.class)public class MyActivityTest { @Test public void clickingButton_shouldChangeResultsViewText() throws Exception { Activity ac