【问题标题】:org.powermock.reflect.exceptions.MethodNotFoundException: No method found with name '' with parameter types: [ java.util.LinkedList ]org.powermock.reflect.exceptions.MethodNotFoundException:找不到名称为“”的方法,参数类型:[java.util.LinkedList]
【发布时间】:2018-10-13 15:07:36
【问题描述】:

我正在使用 PowerMock 开发 Test 类,因为我所有的 Legacy 代码都是使用 Private Static 方法()编写的。

运行测试类时,出现以下错误:

org.powermock.reflect.exceptions.MethodNotFoundException: No method found with name 'insertPaytmBilling' with parameter types: [ java.util.LinkedList ] in class com.xyz.PaytmBilling.
    at org.powermock.reflect.internal.WhiteboxImpl.throwExceptionIfMethodWasNotFound(WhiteboxImpl.java:1122)
    at org.powermock.reflect.internal.WhiteboxImpl.findMethodOrThrowException(WhiteboxImpl.java:913)
    at org.powermock.reflect.internal.WhiteboxImpl.doInvokeMethod(WhiteboxImpl.java:807)
    at org.powermock.reflect.internal.WhiteboxImpl.invokeMethod(WhiteboxImpl.java:675)
    at org.powermock.reflect.Whitebox.invokeMethod(Whitebox.java:401)
    at org.powermock.api.mockito.internal.expectation.PowerMockitoStubberImpl.when(PowerMockitoStubberImpl.java:94)
    at safe.billing.MemberBillingTest.testMemberBilling(MemberBillingTest.java:74)
    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.junit.internal.runners.TestMethod.invoke(TestMethod.java:68)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:326)
    at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:89)
    at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:97)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:310)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:131)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.access$100(PowerMockJUnit47RunnerDelegateImpl.java:59)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner$TestExecutorStatement.evaluate(PowerMockJUnit47RunnerDelegateImpl.java:147)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.evaluateStatement(PowerMockJUnit47RunnerDelegateImpl.java:107)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:298)
    at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:87)
    at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:50)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:218)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:160)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:134)
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34)
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:136)
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:121)
    at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:57)
    at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:538)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)

方法:

private static void insertpaytmBilling(ArrayList allPaytmBill) throws Exception{

    Connection conn = getConnection(userId, passwd, url);

    PreparedStatement pStatement =  conn.prepareStatement(DATA_SQL);

    for (int i=0; i<allPaytmBill.size(); i++){
        MemberBill mBill = (MemberBill) allPaytmBill.get(i);

        pStatement.setString(1, mBill.getMemberId());
        ......
        ......
        ..........

        pStatement.execute();
        //pStatement.addBatch();            
    }   
    pStatement.close();
    conn.close();
}

测试类:

@RunWith(PowerMockRunner.class)
@PrepareForTest({ DriverManager.class, ABCHandler.class })
@PowerMockIgnore("javax.management.*")
public class PaytmBillingTest {
    @Mock
    private static Connection conn;
    List<paytmBill> paytmBillings = null;

    @Before
    public void beforeTest() {
        paytmBillings = new ArrayList<>();

        paytmBill m = new paytmBill();
        ....
        ....
        paytmBillings.add(m);
    }

    @Test
    public void testpaytmBilling() throws Exception {
        // Setup
        Connection conn = PowerMockito.mock(Connection.class);
        PowerMockito.mockStatic(DriverManager.class);
        PowerMockito.mockStatic(ABCHandler.class);
        PowerMockito.mockStatic(PreparedStatement.class);

        // Create Spy
        paytmBilling spy = PowerMockito.spy(new paytmBilling());

        BDDMockito.given(ABCHandler.getConnection(anyString(), anyString(), anyString())).willReturn(conn);

        PowerMockito.doReturn(true).when(spy, "insertpaytmBilling", anyList());

    }
}

Edit-1:

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
Invalid use of argument matchers!
3 matchers expected, 1 recorded:
-> at safe.billing.MemberBillingTest.testMemberBilling(MemberBillingTest.java:76)

This exception may occur if matchers are combined with raw values:
    //incorrect:
    someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
    //correct:
    someMethod(anyObject(), eq("String by matcher"));

【问题讨论】:

    标签: java junit powermock powermockito


    【解决方案1】:

    您在PrepareForTest 注释中缺少paytmBilling 类来监视:

    @PrepareForTest({ DriverManager.class, ABCHandler.class , paytmBilling.class)
    

    【讨论】:

    • @Sayali 请出示insertPaytmBilling方法签名
    • 为什么说没有得到 LinkedList 的方法参数?因为我在实际方法签名中只使用了 ArrayList。
    • @Sayali 你可以更具体一些,将anyList() 替换为any(ArrayList.class)
    • @Sayali 这是不同的问题,我认为不同的路线。
    • - 任何想法如何解决这个问题?
    【解决方案2】:

    有两个问题。首先是参数类型。 cmets 中提出了修复建议:

    更具体地说,将 anyList() 替换为 any(ArrayList.class)

    当你使用这样的结构时:

    PowerMockito.doReturn(true).when(spy, "insertpaytmBilling", anyList())
    

    PowerMock 正在 spy 的类中寻找一个名为“insertpaytmBilling”的方法,其中包含可分配给给定参数列表的参数列表。在您的情况下,anyList() 默认情况下会返回 LinkedList 的实例,该实例不能分配给方法 ArrayList 的实际参数。

    第二个问题(Edit-1)是 Mockito 不支持也不支持同时使用匹配项和原始参数进行模拟。您应该始终使用anyString() 之类的匹配器或参数Some string。正如我从代码 sn-p 和堆栈跟踪中看到的,异常是在测试的另一部分引发的。

    【讨论】:

      猜你喜欢
      • 2019-09-10
      • 1970-01-01
      • 2014-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-27
      相关资源
      最近更新 更多