java - Powermock:尝试模拟静态类时出现 NoClassDefFoundError

标签 java mockito powermock powermockito

我正在尝试了解如何使用 Powermock。 我正在尝试实现静态方法模拟的示例 here .

我根据上面的示例创建了这段代码。

然而,我在尝试运行测试时遇到了 NoClassDefFoundError。

我不知道到底是什么导致了这个错误,因为它主要是复制粘贴的代码。

// imports redacted

@RunWith(PowerMockRunner.class)
@PrepareForTest(Static.class)
public class YourTestCase {
    @Test
    public void testMethodThatCallsStaticMethod() throws Exception {
        // mock all the static methods in a class called "Static"
        PowerMockito.mockStatic(Static.class);
        // use Mockito to set up your expectation
        PowerMockito.when(Static.class, "firstStaticMethod", any()).thenReturn(true);
        PowerMockito.when(Static.class, "secondStaticMethod", any()).thenReturn(321);

        // execute your test
        new ClassCallStaticMethodObj().execute();

        // Different from Mockito, always use PowerMockito.verifyStatic() first
        // to start verifying behavior
        PowerMockito.verifyStatic(Mockito.times(2));
        // IMPORTANT:  Call the static method you want to verify
        Static.firstStaticMethod(anyInt());


        // IMPORTANT: You need to call verifyStatic() per method verification,
        // so call verifyStatic() again
        PowerMockito.verifyStatic(); // default times is once
        // Again call the static method which is being verified
        Static.secondStaticMethod();

        // Again, remember to call verifyStatic()
        PowerMockito.verifyStatic(Mockito.never());
        // And again call the static method.
        Static.thirdStaticMethod();
    }
}

class Static {
    public static boolean firstStaticMethod(int foo) {
        return true;
    }

    public static int secondStaticMethod() {
        return 123;
    }

    public static void thirdStaticMethod() {
    }
}

class ClassCallStaticMethodObj {
    public void execute() {
        boolean foo = Static.firstStaticMethod(2);
        int bar = Static.secondStaticMethod();
    }
}

最佳答案

PowerMock 1.6.6 似乎与 Mockito 2.7 不兼容

我对您的 pom.xml 做了一些更改。首先,我更改了 powermock 版本:

<powermock.version>1.7.0RC2</powermock.version>

然后我把powermock-api-mockito改成了powermock-api-mockito2(第一个不行,好像和Mockito 2.7不兼容):

<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-api-mockito2</artifactId>
    <version>${powermock.version}</version>
    <scope>test</scope>
</dependency>

这解决了 NoClassDefFoundError


无论如何,我仍然必须更改它以使其工作:您应该使用 Mockito.when() 而不是 PowerMockito.when():

Mockito.when(Static.firstStaticMethod(anyInt())).thenReturn(true);
Mockito.when(Static.secondStaticMethod()).thenReturn(321);

关于java - Powermock:尝试模拟静态类时出现 NoClassDefFoundError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43480511/

相关文章:

android - 如何在Android项目中使用PowerMock?

java - Android Intent bundle 总是空的?

java - 优化搜索两个字符串中的关键字

Java Spring MVC 无法在 Heroku 上启动应用程序。错误 H10(找不到 webapp 运行程序)

java - Mockito - 如何从模拟调用触发调用?

java - 如何模拟私有(private)方法以获得代码流中的不同结果

java - 在Android中设置Snackbar的高度

java - 将 Matchers.eq() 与其他模拟值一起使用时出现 InvalidUseOfMatchersException

java - 无法抑制 DriverManager 的静态初始化 block

android - 有没有办法在 AsyncTask 的抽象类保护方法中对代码进行单元测试?