我有一个继承的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();
}
任何帮助将不胜感激!
谢谢,
汤姆
答案 0 :(得分:1)
看起来executeProcess
使用来调用addSubmissionQueue
,但现在已经不行了,但如果没有executeProcess
的代码,则很难确定。< / p>
如果不适合拨打addSubmissionQueue
,您只需删除对该验证热线的引用即可。如果调用它或在特定情况下调用它很重要,请编辑测试,以便verify
行仅在需要调用该方法的测试用例中发生。
请注意,由于涉及Mockito,您的测试不会调用addSubmissionQueue
的实际代码,而是调用 mock 。详细了解Mockito如何在the examples on the Mockito homepage中工作。
答案 1 :(得分:0)
尝试:
import org.mockito.Mockito;
// ...
Mockito.verify(clerkReviewPackageHelper, Mockito.times(0)).addSubmissionQueue();
答案 2 :(得分:0)
您的clerkReviewPackageHelper
模拟似乎与您以executeProcess
的任何方式调用无关。它没有传入,并且似乎没有直接或间接地从 传递给executeProcess
的任何模拟上的任何方法调用返回。因此,期望其中一种方法被executeProcess
调用似乎是不合理的。
您需要做的是查看对executeProcess
的调用,找到调用addSubmissionQueue
的对象(如果有)。如果没有看到executeProcess
的代码,我就无法真正为此提供帮助。它可能是但没有这样的方法调用,正如@JeffBowman在他的回答中推测的那样。但也有其他可能性。
addSubmissionQueue
的对象是executeProcess
的参数之一,那么您应该使用clerkReviewPackageHelper
作为测试中的相应参数。addSubmissionQueue
的对象是executeProcess
的其中一个参数中的字段,则在clerkReviewPackageHelper
的构造函数中注入crFilingToQueuesAction
},或者是设定者,甚至是@InjectMocks
。addSubmissionQueue
的对象是从对executeProcess
的其他参数之一的方法调用中获取的,那么您需要使该调用返回clerkReviewPackageHelper
。这可能意味着将该值注入某个对象,或者它可能意味着在模拟上存在方法调用。例如,如果您正在测试的方法通过调用clerkReviewPackageHelper
之类的行获得crFilingToQueuesForm.getHelper()
,那么您需要编写when(crFilingToQueuesForm.getHelper()).thenReturn(clerkReviewPackageHelper);
或类似内容。当然,它可能比这更复杂。如果没有看到您的代码,我无法分辨。如果您需要更多帮助,请发布executeProcess
方法的代码。
答案 3 :(得分:0)
我在为我的控制器方法编写测试用例时也面临这个问题,我错过的是将参数传递给我的测试方法那些已经声明但未在setup方法中初始化,所以我在setup方法中做了它们并修复了问题