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

PowerMockito.WhenNew()对Junit测试很好,但对TestNg测试不起作用

严峰
2023-03-14

我正在使用TestNG对我的应用程序进行单元测试和模拟。

我的问题是,当我使用PowerMockito.WhenNew(ClassB.Class)方法并在ClassA中调试时,我发现ObjB是原来没有被嘲弄的那个。
经过多次调查,我使用了

导入org.testng.annotations.test;

并尝试使用Junit测试而不是TestNG。令人惊讶的是,它用JUnit(666)返回了预期的值,但用TestNG返回了(15)这是不期望的。

下面是所有类和pom文件

package unit.test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.testng.annotations.Test;

@RunWith(PowerMockRunner.class)
@PrepareForTest({ ClassA.class, ClassB.class })
public class App {
    @Test
    public void shoudlReturn666() throws Exception {
        ClassB mockB = PowerMockito.mock(ClassB.class);
        PowerMockito.when(mockB.get15()).thenReturn(666);
        PowerMockito.whenNew(ClassB.class).withNoArguments().thenReturn(mockB);
        Assert.assertTrue(new ClassA().callB() == 666);
    }
}
package unit.test;
public class ClassA {
    public int callB() {
        ClassB objB = new ClassB();
        return objB.get15();
    }
}
package unit.test;
public class ClassB {
    public int get15() {
        return 15;
    }
}
<dependencies>
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-all</artifactId>
            <version>1.10.19</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-mockito-release-full</artifactId>
            <version>1.6.4</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-api-mockito</artifactId>
            <version>1.5</version>
            <scope>test</scope>
        </dependency>
</dependencies>
                [TestNG] Running:
              C:\Users\Wael Elkholy\AppData\Local\Temp\testng-eclipse--514551319\testng-customsuite.xml

            FAILED: shoudlReturnTheCValue
            junit.framework.AssertionFailedError: null
                at junit.framework.Assert.fail(Assert.java:47)
                at junit.framework.Assert.assertTrue(Assert.java:20)
                at junit.framework.Assert.assertTrue(Assert.java:27)
                at unit.test.App.shoudlReturnTheCValue(App.java:17)
                at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
                at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
                at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
                at java.lang.reflect.Method.invoke(Unknown Source)
                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.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:132)
                at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:230)
                at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:76)


            ===============================================
                Default test
                Tests run: 1, Failures: 1, Skips: 0
            ===============================================


            ===============================================
            Default suite
            Total tests run: 1, Failures: 1, Skips: 0
            ===============================================

            [TestNG] Time taken by org.testng.reporters.XMLReporter@2752f6e2: 59 ms
            [TestNG] Time taken by org.testng.reporters.EmailableReporter2@48140564: 20 ms
            [TestNG] Time taken by org.testng.reporters.SuiteHTMLReporter@c818063: 65 ms
            [TestNG] Time taken by org.testng.reporters.jq.Main@7dc36524: 127 ms
            [TestNG] Time taken by [FailedReporter passed=0 failed=0 skipped=0]: 18 ms
            [TestNG] Time taken by org.testng.reporters.JUnitReportReporter@2133c8f8: 18 ms

共有1个答案

董庆
2023-03-14

根据PowerMock文档:

@PrepareForTest({ ClassA.class, ClassB.class })
public class App extends PowerMockTestCase {
    @Test
    public void shoudlReturn666() throws Exception {
        ClassB mockB = PowerMockito.mock(ClassB.class);
        PowerMockito.when(mockB.get15()).thenReturn(666);
        PowerMockito.whenNew(ClassB.class).withNoArguments().thenReturn(mockB);
        Assert.assertTrue(new ClassA().callB() == 666);
    }
}
 类似资料:
  • 问题: TestNG正在运行所有172个测试,但是它只报告了81个测试运行,没有报告一些失败(实际上有两个测试失败,但只报告了一个)。 似乎未报告的测试是有什么方法可以让TestNG正确识别这些测试并正确报告它们的结果吗?

  • 我有一个带有Java配置类的Spring(4.2.5)项目。这些在正常运行项目时起作用,但我无法使我的测试工作。在下面的测试中,为空。 如果添加注释,则会出现异常 其中和在和中定义,后者是基于活动配置文件选择的。 [编辑2] 经过更多的搜索,我发现了这个问题,并且在检查了我的依赖项之后,我发现我在maven依赖项下有Spring-Core-4.1.9,而且我没有在我的POM中包含一个依赖项。添加依

  • 并添加注释 我得到一条消息:没有测试找到test runner JUnit5,并且在Problems选项卡中有SpringBootTest.jar无法读取或者不是有效的ZIP文件 也试过 我也试过: 如果我将字符串myUrl硬编码为“http://localhost:8090”,则测试工作正常,因此问题在于@value不工作

  • 我试图在Eclipse中使用Selenium运行TestNG。 当类文件作为TestNG测试运行时,我得到的测试Run=0。 问题会是什么? 我有testNg插件 testng。xml文件: 类: WebDriverTest类: BrowserInstance类: 注: 当我将testing.xml文件作为TestNG Suite运行时,结果是: 当我运行. java文件作为TestNG测试时,结

  • 问题内容: 我们刚刚开始在我们的项目上使用Gradle和TestNG,所以我正在检查是否有任何测试失败实际上会使构建失败。我很惊讶地发现事实并非如此。正确地拾取并编译了测试,因此我看到了类文件。我也得到了运行的报告,但是显示0个测试(预期2个)。跑步给我以下内容: SuperSimpleTest.java: build.gradle包含: 我已经看过有关此主题的其他问题,并且找到了用作解决方法的提

  • 我们刚刚开始在我们的项目中使用Gradle和TestNG,所以我正在检查失败的任何测试是否真的失败了构建。我很惊讶地看到它没有。测试被正确地拾取和编译,所以我看到了类文件。我也收到了运行报告,但它说0个测试(预计为2个)。运行给我以下信息: SuperSimpleTest.java: 生成.gradle 包含: 我已经看了一下有关此主题的其他问题,在那里我发现了使用作为解决方法的提示(请参阅 ht