【问题标题】:Wanted but not invoked: Mockito and Powermock需要但未调用:Mockito 和 Powermock
【发布时间】:2013-11-11 21:17:13
【问题描述】:

我继承了一个不再有效的 Junit 测试。它使用 PowerMock 1.4.12、Mockito 1.9.0 和 Junit 4.8.2。它正在工作一段时间但停止了,我正试图让它再次工作。

Wanted but not invoked:
clerkReviewPackageHelper.addSubmissionQueue(
    <any>,
    <any>,
    <any>,
    <any>
);
-> at icis.cr.approvefilingdetail.CRFilingToQueuesActionTest.test_post_handled_add_submission_queue(CRFilingToQueuesActionTest.java:47)
Actually, there were zero interactions with this mock.

    at icis.cr.approvefilingdetail.CRFilingToQueuesActionTest.test_post_handled_add_submission_queue(CRFilingToQueuesActionTest.java:47)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:592)
    at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:66)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:312)
    at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:86)
    at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:94)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:296)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:284)
    at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:84)
    at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:209)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:148)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:122)
    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:120)
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:102)
    at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53)
    at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:42)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

这是此测试的代码:

@Test
public void test_post_handled_add_submission_queue() throws Exception {
    when(request.getMethod()).thenReturn(BaseCRAction.POST);
    when(sessionInfo.getSubmissionId()).thenReturn(SUBMISSION_ID);
    when(crFilingToQueuesForm.getAction()).thenReturn(null);
    crFilingToQueuesAction.executeProcess(actionMapping, crFilingToQueuesForm, request, response);
    verify(clerkReviewPackageHelper, times(0)).removeSubmissionQueue(null);
    **verify(clerkReviewPackageHelper).addSubmissionQueue(any(String.class), any(String.class), any(String.class), any(String.class));**
    verify(actionMapping).findForward(eq(BaseCRAction.FORWARD_SUCCESS_REDIRECT));
}

这是它从异常行中调用的方法:

public void addSubmissionQueue(String submissionId, String queueId, String reviewOn, String employeeId) throws BadDBConnection {
Session session = injector.inject();
session.executeNonSelectingCall(clerkReviewPackage.addQueue(submissionId, queueId, reviewOn, employeeId));
session.release();
}

任何帮助将不胜感激!

谢谢,

汤姆

【问题讨论】:

  • 你是对的 Jeff,因为我查看了签入日志,你是对的。我需要复习 mockito 和 powermock,所以我可以更新这些单元测试。
  • 很高兴为您提供帮助!我删除了上述评论并将其提升为答案,因此您可以将答案标记为已接受(或者其他贡献者可以扩展和编辑)。如果您对代码的作用或如何修复可以粘贴的特定行有任何具体问题,请务必询问。祝您好运!

标签: java unit-testing junit mockito powermock


【解决方案1】:

看起来executeProcess使用调用addSubmissionQueue,但不再使用,但没有executeProcess的代码很难确定。

如果不调用addSubmissionQueue 是合适的,您可以简单地删除对该验证行的引用。如果调用它很重要,或者在特定情况下调用它,请编辑测试,使verify 行仅出现在需要调用该方法的测试用例中。

请注意,由于涉及到 Mockito,因此您的测试不会调用 addSubmissionQueue 的实际代码,而是调用 mock。在the examples on the Mockito homepage 中阅读有关 Mockito 工作原理的更多信息。

【讨论】:

    【解决方案2】:

    试试:

    import org.mockito.Mockito;
    
    // ...
    
    Mockito.verify(clerkReviewPackageHelper, Mockito.times(0)).addSubmissionQueue();
    

    【讨论】:

      【解决方案3】:

      您的clerkReviewPackageHelper 模拟似乎与您对executeProcess 的调用没有任何关联。它没有被传入,而且似乎也没有直接或间接地从任何对 传入executeProcess 的模拟的任何方法调用中返回。因此,期望其中一种方法被executeProcess 调用似乎不太合理。

      您需要做的是查看对executeProcess 的调用并找到调用addSubmissionQueue 的对象(如果有)。如果没有看到executeProcess 的代码,我真的无法为此提供帮助。可能是这样,但没有这样的方法调用,正如@JeffBowman 在他的回答中所推测的那样。但也有其他可能性。

      • 如果调用addSubmissionQueue的对象是executeProcess的参数之一,那么你应该在测试中使用clerkReviewPackageHelper作为对应的参数。
      • 如果调用addSubmissionQueue的对象是executeProcess的参数之一中的a字段,则注入clerkReviewPackageHelper,要么在crFilingToQueuesAction的构造函数中,要么在setter中,甚至@InjectMocks
      • 如果调用addSubmissionQueue 的对象是通过对executeProcess 的其他参数之一的方法调用获得的,那么您需要使该调用返回clerkReviewPackageHelper。这可能意味着将该值注入到某个对象中,或者可能意味着对模拟的方法调用进行存根。例如,如果您正在测试的方法通过调用crFilingToQueuesForm.getHelper() 之类的行获得clerkReviewPackageHelper,那么您需要编写when(crFilingToQueuesForm.getHelper()).thenReturn(clerkReviewPackageHelper); 或类似的东西。当然,它可能会比这更复杂。没有看到您的代码,我无法判断。

      如果您需要更多帮助,请发布您的 executeProcess 方法的代码。

      【讨论】:

        【解决方案4】:

        我在为我的控制器方法编写测试用例时也遇到了这个问题,我错过了将参数传递给我的测试方法,这些参数在 setup 方法中声明但未初始化,所以我在 setup 方法中做了它们并修复了问题.

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-31
          • 1970-01-01
          相关资源
          最近更新 更多