【问题标题】:Powemockito constructor testing problemsPowermockito 构造函数测试问题
【发布时间】:2014-09-04 20:39:03
【问题描述】:

Hej 我在使用 1.5.5 和 1.5.6 时尝试过 TestNG 和 powerMockito 1.5.x 有一些问题。问题是当我尝试验证一个非空的构造函数时。

我已经检查了很多关于从 PowerMockTestCase 扩展等的示例,但它们似乎对我不起作用。

package com.cdev.common;
public class TestSubject {

    String data;
    String context;

    public TestSubject()
    {
        this.data = "Mock!!";
        this.context = "PowerMockito";

    }

    public TestSubject(String data)
    {
        this.data = data;
        this.context = "PowerMockito";
    }

    public TestSubject(String data,String context)
    {
        this.data = data;
        this.context = context;
    }

    public String getData()
    {
        throw new UnsupportedOperationException();
    }

    public String getContext()
    {
        throw new UnsupportedOperationException();

    }

    public boolean isNew()
    {
        throw new UnsupportedOperationException();
    }
}

这是 testNG 测试:

package com.cdev.common.test;

import com.cdev.common.*;

import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.testng.Assert;
import org.testng.annotations.Test;


@PrepareForTest({TestSubject.class})
public class TestSubjectTest{

    @Test
    public void TestSubject() throws Exception
    {
        System.out.println("======== Test ==================");

        TestSubject mockTestSubject = PowerMockito.mock(TestSubject.class);

        PowerMockito.whenNew(TestSubject.class).withArguments("A", "B").thenReturn(mockTestSubject);

        PowerMockito.when(mockTestSubject.getData()).thenReturn("A");
        PowerMockito.when(mockTestSubject.getContext()).thenReturn("B");
        PowerMockito.when(mockTestSubject.isNew()).thenReturn(true);


        PowerMockito.verifyNew(TestSubject.class).withArguments("A", "B");

        TestSubject lala = new TestSubject("A","B");

        System.out.println(lala.getData());
        System.out.println(lala.isNew());

        Assert.assertTrue(lala.getData().equals("A"), "Not equal");
    }
}

这给了我这个输出:

[TestNG] Running:
  /tmp/testng-eclipse--2099806353/testng-customsuite.xml

======== Test ==================
FAILED: TestSubject
java.lang.AssertionError: Wanted but not invoked com.cdev.common.TestSubject(
    "A",
    "B"
);
Actually, there were zero interactions with this mock.
    at org.powermock.api.mockito.internal.invocation.InvocationControlAssertionError.throwAssertionErrorForNewSubstitutionFailure(InvocationControlAssertionError.java:93)
    at org.powermock.api.mockito.internal.verification.DefaultConstructorArgumentsVerfication.invokeSubstitute(DefaultConstructorArgumentsVerfication.java:51)
    at org.powermock.api.mockito.internal.verification.DefaultConstructorArgumentsVerfication.withArguments(DefaultConstructorArgumentsVerfication.java:44)
    at com.cdev.common.test.TestSubjectTest.TestSubject(TestSubjectTest.java:32)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84)
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:714)
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
    at org.testng.TestRunner.privateRun(TestRunner.java:767)
    at org.testng.TestRunner.run(TestRunner.java:617)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
    at org.testng.SuiteRunner.run(SuiteRunner.java:240)
    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)


===============================================
    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.SuiteHTMLReporter@6d9c638: 18 ms
[TestNG] Time taken by org.testng.reporters.EmailableReporter2@2401f4c3: 6 ms
[TestNG] Time taken by org.testng.reporters.JUnitReportReporter@5d22bbb7: 3 ms
[TestNG] Time taken by org.testng.reporters.jq.Main@3d012ddd: 31 ms
[TestNG] Time taken by [FailedReporter passed=0 failed=0 skipped=0]: 2 ms
[TestNG] Time taken by org.testng.reporters.XMLReporter@1175e2db: 5 ms

【问题讨论】:

  • 那么......你为什么要嘲笑这样的事情?新对象似乎并不深入依赖项或任何内容。您可以使用 setter/getter 或反射显式测试。
  • Hej 这只是概念验证或测试以控制 powermockito,所以这不是真正的生产代码,如果你知道我的意思的话。

标签: java unit-testing testng mockito


【解决方案1】:

您需要在调用完成后将verifyNew 调用移至:

TestSubject lala = new TestSubject("A","B");
PowerMockito.verifyNew(TestSubject.class).withArguments("A", "B");

【讨论】:

    【解决方案2】:

    按照您的指示:

    @Test
    public void TestSubject() throws Exception
    {
        System.out.println("======== Test ==================");
    
        TestSubject mockTestSubject = PowerMockito.mock(TestSubject.class);
    
        PowerMockito.whenNew(TestSubject.class).withArguments("A", "B").thenReturn(mockTestSubject);
    
        PowerMockito.when(mockTestSubject.getData()).thenReturn("A");
        PowerMockito.when(mockTestSubject.getContext()).thenReturn("B");
        PowerMockito.when(mockTestSubject.isNew()).thenReturn(true);
    
        **TestSubject lala = new TestSubject("A","B");
        PowerMockito.verifyNew(TestSubject.class).withArguments("A", "B");**        
    
        System.out.println(lala.getData());
        System.out.println(lala.isNew());
    
        Assert.assertTrue(lala.getData().equals("A"), "Not equal");
    }
    

    输出:

    [TestNG] Running:
      /tmp/testng-eclipse--349458877/testng-customsuite.xml
    
    ======== Test ==================
    FAILED: TestSubject
    java.lang.AssertionError: Wanted but not invoked com.cdev.common.TestSubject(
        "A",
        "B"
    );
    Actually, there were zero interactions with this mock.
        at org.powermock.api.mockito.internal.invocation.InvocationControlAssertionError.throwAssertionErrorForNewSubstitutionFailure(InvocationControlAssertionError.java:93)
        at org.powermock.api.mockito.internal.verification.DefaultConstructorArgumentsVerfication.invokeSubstitute(DefaultConstructorArgumentsVerfication.java:51)
        at org.powermock.api.mockito.internal.verification.DefaultConstructorArgumentsVerfication.withArguments(DefaultConstructorArgumentsVerfication.java:44)
        at com.cdev.common.test.TestSubjectTest.TestSubject(TestSubjectTest.java:28)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:483)
        at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84)
        at org.testng.internal.Invoker.invokeMethod(Invoker.java:714)
        at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
        at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
        at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
        at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
        at org.testng.TestRunner.privateRun(TestRunner.java:767)
        at org.testng.TestRunner.run(TestRunner.java:617)
        at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
        at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
        at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
        at org.testng.SuiteRunner.run(SuiteRunner.java:240)
        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)
    
    
    ===============================================
        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.SuiteHTMLReporter@6d9c638: 36 ms
    [TestNG] Time taken by org.testng.reporters.EmailableReporter2@2401f4c3: 8 ms
    [TestNG] Time taken by org.testng.reporters.JUnitReportReporter@5d22bbb7: 13 ms
    [TestNG] Time taken by org.testng.reporters.jq.Main@3d012ddd: 45 ms
    [TestNG] Time taken by [FailedReporter passed=0 failed=0 skipped=0]: 4 ms
    [TestNG] Time taken by org.testng.reporters.XMLReporter@1175e2db: 5 ms
    

    【讨论】:

      猜你喜欢
      • 2017-05-01
      • 2012-12-29
      • 2013-09-28
      • 2022-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多