【问题标题】:TestNG and Powermockito - cannot mock static voidTestNG 和 Powermockito - 无法模拟静态 void
【发布时间】:2015-04-01 14:41:13
【问题描述】:

我无法让 Powermock 与 TestNG 一起工作。调整为 JUnit 的相同代码工作正常,但在 TestNG 中它以某种方式失败。 TestNG 版本为 6.8.21 Powermockito 版本是 1.6.1

package p;

import org.mockito.MockitoAnnotations;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.testng.Assert;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;


import static org.powermock.api.mockito.PowerMockito.mockStatic;

@PrepareForTest({FooTest.class})
public class FooTest {

    @BeforeTest
    public void setup() {
        mockStatic(FooTest.class);
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void test() throws Exception {
        PowerMockito.doNothing().when(FooTest.class,"foo");
        FooTest.foo();

        Assert.assertEquals(1, 1);
    }

    public static void foo() throws Exception {
        throw new Exception("huh?");
    }
}

我得到的例外是 when 方法:

java.lang.Exception: huh?
    at p.FooTest.foo(FooTest.java:32)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.powermock.reflect.internal.WhiteboxImpl.performMethodInvocation(WhiteboxImpl.java:1873)
    at org.powermock.reflect.internal.WhiteboxImpl.doInvokeMethod(WhiteboxImpl.java:773)
    at org.powermock.reflect.internal.WhiteboxImpl.invokeMethod(WhiteboxImpl.java:753)
    at org.powermock.reflect.Whitebox.invokeMethod(Whitebox.java:466)
    at org.powermock.api.mockito.internal.expectation.PowerMockitoStubberImpl.when(PowerMockitoStubberImpl.java:106)
    at p.FooTest.test(FooTest.java:25)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:85)
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:696)
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:882)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1189)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:124)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:108)
    at org.testng.TestRunner.privateRun(TestRunner.java:767)
    at org.testng.TestRunner.run(TestRunner.java:617)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:348)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:343)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:305)
    at org.testng.SuiteRunner.run(SuiteRunner.java:254)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1149)
    at org.testng.TestNG.run(TestNG.java:1057)
    at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111)
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204)
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175)
    at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:125)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.CommandLineWrapper.main(CommandLineWrapper.java:130)
===============================================
Custom suite
Total tests run: 1, Failures: 1, Skips: 0
===============================================

那么我在这里错过了什么?

【问题讨论】:

  • 好的,除了你不应该首先模拟静态方法之外,我不确定你是否可以@PrepareForTest 你的测试类本身;您是否尝试过将该方法放在另一个类中?
  • @fge 出于好奇,在需要时模拟静态方法有什么问题?在一个真实世界的应用程序中,我最近不得不模拟其中的一些(在 JSF FacesContext 类和 JasperReports 的类中);如果我不嘲笑他们,我还能如何编写测试?为 FacesContext 和 JasperReports 创建不必要的包装器?
  • @fge,我确实做到了。这只是一个最小化的样本。顺便说一句,当我转换为 JUnit 时,它工作正常。

标签: java testng static-methods powermock


【解决方案1】:

我怀疑这可能是与this question 相同的问题和解决方案。换句话说,请确保您使用的是org.powermock.modules.testng.PowerMockObjectFactory。但正如@fge 所说,您应该@PrepareForTest 包含要模拟的静态方法的类,它不应该是测试类本身......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多