【问题标题】:TestNG Parameterized Test and PowerMockito causes MethodMatcherExceptionTestNG 参数化测试和 PowerMockito 导致 MethodMatcherException
【发布时间】:2018-02-28 06:20:36
【问题描述】:

我正在使用

org.powermock:powermock-module-testng:1.7.3
org.powermock:powermock-api-mockito:1.7.3
org.testng:testng:6.11

一切正常,直到我添加

org.powermock.core.classloader.annotations.PrepareForTest 注释 并使用 org.powermock.modules.testng.PowerMockTestCase 扩展类,如

它会抛出错误

org.testng.internal.reflect.MethodMatcherException: 
Data provider mismatch
Method: myParameterizedTest([Parameter{index=0, type=javax.servlet.http.HttpServletRequest, declaredAnnotations=[]}, Parameter{index=1, type=javax.servlet.http.HttpServletResponse, declaredAnnotations=[]}, Parameter{index=2, type=boolean, declaredAnnotations=[]}, Parameter{index=3, type=java.lang.String, declaredAnnotations=[]}, Parameter{index=4, type=java.lang.String, declaredAnnotations=[]}, Parameter{index=5, type=java.lang.Integer, declaredAnnotations=[]}, Parameter{index=6, type=java.lang.Integer, declaredAnnotations=[]}, Parameter{index=7, type=org.springframework.http.HttpStatus, declaredAnnotations=[]}, Parameter{index=8, type=java.lang.Integer, declaredAnnotations=[]}])
Arguments: [($javax.servlet.http.HttpServletRequest$$EnhancerByMockitoWithCGLIB$$471f26c6)Mock for HttpServletRequest, hashCode: 1677543539,($javax.servlet.http.HttpServletResponse$$EnhancerByMockitoWithCGLIB$$5ed2ff98)Mock for HttpServletResponse, hashCode: 504478805,(java.lang.Boolean)false,(java.lang.String)2018-02-13,(java.lang.String)2018-02-28,(java.lang.Integer)1,(java.lang.Integer)10,(org.springframework.http.HttpStatus)200,(java.lang.Integer)1]

    at org.testng.internal.reflect.DataProviderMethodMatcher.getConformingArguments(DataProviderMethodMatcher.java:49)
    at org.testng.internal.Invoker.injectParameters(Invoker.java:1293)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1187)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:126)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
    at org.testng.TestRunner.privateRun(TestRunner.java:744)
    at org.testng.TestRunner.run(TestRunner.java:602)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:380)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:375)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:340)
    at org.testng.SuiteRunner.run(SuiteRunner.java:289)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1301)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1226)
    at org.testng.TestNG.runSuites(TestNG.java:1144)
    at org.testng.TestNG.run(TestNG.java:1115)
    at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:72)
    at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123)

其他一切正常!

编辑:

重现问题的代码

build.gradle

group 'parameterized-test'
version '1.0-SNAPSHOT'

apply plugin: 'java'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'org.testng', name: 'testng', version: '6.14.2'
    testCompile group: 'org.powermock', name: 'powermock-module-testng', version: '1.7.3'
    testCompile group: 'org.powermock', name: 'powermock-api-mockito', version: '1.7.3'
}

NameUtil.java

package com.practice.two;

public class NameUtil {
    public static String capMe(String string){
        return string.toUpperCase();
    }
}

SimpleClass.java

package com.practice.two;

public class SimpleClass {
    private String name;

    public SimpleClass(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return name;
    }
}

MainTest.java

package com.practice.two;

import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.testng.PowerMockTestCase;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

@PrepareForTest(NameUtil.class)
public class MainTest extends PowerMockTestCase {

    @BeforeMethod
    public void setUp() {
        PowerMockito.mockStatic(NameUtil.class);
    }

    @DataProvider(name = "demoDataProvider")
    public Object[][] demoDataProvider() {
        return new Object[][]{
                {new SimpleClass("Yudhisthir"), "Yudhisthir", 24},
                {new SimpleClass("Bheem"), "Bheem", 22},
                {new SimpleClass("Arjun"), "Arjun", 26},
                {new SimpleClass("Nakul"), "Nakul", 21},
                {new SimpleClass("Sahdev"), "Sahdev", 23}
        };
    }

    @Test(dataProvider = "demoDataProvider")
    public void testMethod(SimpleClass sc, String name, Integer integer) {
        Mockito.when(NameUtil.capMe(Mockito.anyString())).thenReturn("MAHABAHRAT");
        System.out.println(NameUtil.capMe(name));
        System.out.println(integer);
        System.out.println(sc);
    }
}

【问题讨论】:

  • 您能否提供sscce 来重现您的问题?
  • @Morfic 请看问题!更新代码以重现问题

标签: java testng powermock testng-dataprovider


【解决方案1】:

你遇到过这个错误 - https://github.com/powermock/powermock/issues/484

你也将面对这个 -https://github.com/powermock/powermock/issues/678

以下代码按预期工作:

build.gradle

dependencies {
        testCompile group: 'org.testng', name: 'testng', version: '6.9.13.6'
        testCompile group: 'org.powermock', name: 'powermock-module-testng', version: '2.0.0-beta.5'
        testCompile group: 'org.powermock', name: 'powermock-api-mockito2', version: '2.0.0-beta.5'
}

MainTest.java

import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.testng.PowerMockTestCase;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;


@PrepareForTest(NameUtil.class)
public class MainTest extends PowerMockTestCase {

    @BeforeMethod
    public void setUp() {
        PowerMockito.mockStatic(NameUtil.class);
    }

    @DataProvider(name = "demoDataProvider")
    public Object[][] demoDataProvider() {
        return new Object[][]{
                {new methodMatcherException.MainTest.SimpleClass("Yudhisthir"), "Yudhisthir", 24},
                {new methodMatcherException.MainTest.SimpleClass("Bheem"), "Bheem", 22},
                {new methodMatcherException.MainTest.SimpleClass("Arjun"), "Arjun", 26},
                {new methodMatcherException.MainTest.SimpleClass("Nakul"), "Nakul", 21},
                {new methodMatcherException.MainTest.SimpleClass("Sahdev"), "Sahdev", 23}
        };
    }

    @Test(dataProvider = "demoDataProvider")
    public void testMethod(Object o, String name, Integer integer) {
        SimpleClass sc = (SimpleClass) o;
        Mockito.when(NameUtil.capMe(Mockito.anyString())).thenReturn("MAHABAHRAT");
        System.out.println(NameUtil.capMe(name));
        System.out.println(integer);
        System.out.println(sc);
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 2020-11-17
    相关资源
    最近更新 更多