PowerMock没有正确存根静态方法?

时间:2014-07-31 05:44:21

标签: java android mockito powermock robolectric

我正在尝试使用powermock和Robolectric编写一个非常简单的测试。这是我的代码:

import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.robolectric.RobolectricTestRunner;

import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(RobolectricTestRunner.class)
@PowerMockIgnore({ "org.mockito.*", "org.robolectric.*", "android.*" })
@PrepareForTest(BadStaticClass.class)
public class SomeActivityTest {

    @Test
    public void testSomething() {
        PowerMockito.mockStatic(BadStaticClass.class);
        Mockito.when(BadStaticClass.dontWantThisMethod()).thenReturn(false);
        new SomeActivity().usesStatic();
    }
}

基本上,我有一个类“So​​meActivity”,它有一个调用BadStaticClass.dontWantThisMethod()的方法。我希望这个静态方法被删除。

为什么我的代码不起作用?

我一直收到如下错误: you are trying to stub a final method, you naughty developer!

其中,我认为PowerMock的重点是看不出来。

1 个答案:

答案 0 :(得分:0)

根据PowerMock API,您必须为某些版本的JUnit包含@RunWith(PowerMockRunner.class)等。但您还需要使用@RunWith(RobolectricTestRunner.class)并且不能指定多个@RunWith在一个班级上。

那该怎么办?

我怀疑您可以保留上面的代码并引入JUnit @Rule(请参阅:PowerMockRule docs),并在此similar post中进行了描述。请务必检查您正在使用的Jars版本,以便它们与其他SO帖子中描述的版本相匹配。除非您获得兼容版本,否则通常情况下都不会起作用,而且并不总是很明显哪些版本兼容。