使用 PowerMockito 测试静态方法时出现 MissingMethodInvocationException

MissingMethodInvocationException when using PowerMockito to test static method

我阅读了几篇关于使用 powermockito 而不是 mockito 来测试静态方法的帖子,但是在切换到 power mockito 之后,我仍然遇到同样的错误。下面是我的 class 和异常。异常中的两种情况都无法解释我遇到的错误。

@RunWith(PowerMockRunner.class)
@PrepareForTest({ClassToBeMocked.class})
public class Test extends AbstractTestNGSpringContextTests {
    @Mock
    Object1 o1;

    @BeforeMethod
    public void init() {
        mockStatic(ClassToBeMocked.class);

        PowerMockito.when(ClassToBeMocked.getMethod()).thenReturn("string");
    }

最后一行代码导致了这个异常 org.mockito.exceptions.misusing.MissingMethodInvocationException: when() 需要一个必须为 'a method call on a mock' 的参数。 例如: 当(mock.getArticles()).thenReturn(文章);

此外,出现此错误的原因可能是: 1. 您对以下任一方法存根:final/private/equals()/hashCode() 方法。 那些方法不能是stubbed/verified。 不支持在非 public 父 classes 上声明的模拟方法。 2. 在 when() 内部,你不是在 mock 上调用方法,而是在其他一些对象上调用方法。

你能试试这个吗:

@RunWith(PowerMockRunner.class)
@PrepareForTest({ClassToBeMocked.class})
public class Test extends PowerMockTestCase {
    @Mock
    Object1 o1;

    @ObjectFactory
    public IObjectFactory getObjectFactory() {
        return new org.powermock.modules.testng.PowerMockObjectFactory();
    }

    @BeforeMethod
    public void init() {
        mockStatic(ClassToBeMocked.class);

        PowerMockito.when(ClassToBeMocked.getMethod()).thenReturn("string");
    }

我实际上正在为类似的问题而苦苦挣扎,但我确实看到上面的问题。 @RunWith 注释是 JUnit 库的一部分。 AbstractTestNGSpringContextTests 和@BeforeMethod 是 TestNG 库的一部分。这可能就是您 运行 遇到问题的原因。除非有人想反驳这个说法,否则我相信这两个单元测试库不能相互配合。至少不是那样。

@RunWith(PowerMockRunner.class) 将无法获取 @BeforeMethod,就好像它是 org.junit.Before.