mockito 即使在调用方法时验证也失败

vbopmzt1  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(247)

我正在测试下面的代码,但是测试用例失败了。第23行给出了InvocationTargetException。如果调用了某个其他mock的方法,返回mock是否有问题?
此外,即使我注解了第23行,下面的第26行也会使verify失败。打开调试器会抛出InvocationTargetException。我只是检查fetchSideThing方法是否被调用过一次。我该怎么做呢?

  1. @Getter
  2. @Setter
  3. public class SideThing {
  4. int weight;
  5. SideThing(int weight) {
  6. this.weight = weight;
  7. }
  8. public static SideThing get(int w) {
  9. return new SideThing(w);
  10. }
  11. }
  12. public class ThingGrandParent {
  13. int tgpVal;
  14. ThingGrandParent(int val) {
  15. tgpVal = val;
  16. }
  17. public ThingParent GpFun(int y) {
  18. return new ThingParent(y);
  19. }
  20. }
  21. public class ThingParent {
  22. SideThing st;
  23. ThingParent(int x) {
  24. st = new SideThing(x);
  25. }
  26. public SideThing fetchSideThing() {
  27. return st;
  28. }
  29. private int anotherFun(int y) {
  30. return y;
  31. }
  32. }
  33. @Getter
  34. @Setter
  35. public class Thing {
  36. private int size;
  37. private int name;
  38. Thing() {}
  39. int bLogic(int size) throws Exception {
  40. ThingGrandParent tgp = fun(size);
  41. SideThing st;
  42. ThingParent tp = tgp.GpFun(size);
  43. st = tp.fetchSideThing();
  44. return st.getWeight();
  45. }
  46. public ThingGrandParent fun(int size) {
  47. return new ThingGrandParent(size);
  48. }
  49. }
  50. @RunWith(PowerMockRunner.class)
  51. @PowerMockIgnore("javax.management.*")
  52. @PrepareForTest({Thing.class, SideThing.class})
  53. public class ThingTest {
  54. @Mock
  55. ThingParent tp;
  56. @Mock
  57. ThingGrandParent tgpp;
  58. Thing t;
  59. @Before
  60. public void setup() {
  61. MockitoAnnotations.initMocks(this);
  62. t = spy(new Thing()); // does it matter here if `t` is an InjectMocks or a spy?
  63. }
  64. @Test
  65. public void test1() throws Exception {
  66. when(tgpp.GpFun(anyInt())).thenReturn(tp); // -- line23, why InvocationTargetException?
  67. assertEquals(4, t.bLogic(4));
  68. verify(tp, times(1)).fetchSideThing(); //-- line26 InvocationTargetException
  69. }
  70. }

此外,如代码中所示,如果我对Thing t使用spy或InjectMocks,真的会有什么不同吗?
我已经在setup()中使用了MockitoAnnotations.initMocks(this);,但是它说'initMocks(java.lang.Object)'已经过时了。那么我还应该在这里使用什么呢?
以下是失败消息:

  1. Wanted but not invoked:
  2. tp.fetchSideThing();
  3. -> at com.amazon.configurationeditor.store.ThingTest.test1(ThingTest.java:62)
  4. Actually, there were zero interactions with this mock.
  5. Wanted but not invoked:
  6. tp.fetchSideThing();
  7. -> at com.amazon.configurationeditor.store.ThingTest.test1(ThingTest.java:62)
  8. Actually, there were zero interactions with this mock.
  9. at com.amazon.configurationeditor.store.ThingTest.test1(ThingTest.java:62)
  10. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  11. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  12. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  13. at java.lang.reflect.Method.invoke(Method.java:498)
  14. at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68)
  15. at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:326)
  16. at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:89)
  17. at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:97)
  18. at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:310)
  19. at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:131)
  20. at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.access$100(PowerMockJUnit47RunnerDelegateImpl.java:59)
  21. at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner$TestExecutorStatement.evaluate(PowerMockJUnit47RunnerDelegateImpl.java:147)
  22. at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.evaluateStatement(PowerMockJUnit47RunnerDelegateImpl.java:107)
  23. at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82)
  24. at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:298)
  25. at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:87)
  26. at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:50)
  27. at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:218)
  28. at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:160)
  29. at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:134)
  30. at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34)
  31. at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44)
  32. at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:136)
  33. at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:117)
  34. at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:57)
  35. at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59)
  36. at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
  37. at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
  38. at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
  39. at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
  40. at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
  41. at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235)
  42. at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)
gudnpqoy

gudnpqoy1#

initMocks不应该从你的测试中调用。不确定你为什么要使用PowerMockito,我假设Mockito是通常的选择。删除ThingTest类上的3个注解。
如果您使用JUnit 4,请查看@Rule和Mockito.rule(),例如。

  1. @Rule
  2. public MockitoRule rule = MockitoJUnit.rule()

编辑:我假设还有一些其他的关键问题,Thing 't'没有tp或tgpp集,它将创建新的对象,这些不是mock。
确保Thing t为spy进行了正确的初始化。也许你应该在设置中添加:一个月一个月?

相关问题