【问题标题】:Using Mockito inline mockConstruction the same as PowerMocito whenNew使用 Mockito inline mockConstruction 与 PowerMocito whenNew 相同
【发布时间】:2021-08-02 20:43:55
【问题描述】:

由于 Mockito 支持模拟静态和模拟构造,我正在尝试更新现有代码以删除 PowerMockito 并用 Mockito 替换它。

我知道您可以执行以下操作:

 assertEquals("foo", new Foo().method());
 try (MockedConstruction mocked = mockConstruction(Foo.class)) {
         Foo foo = new Foo();
         when(foo.method()).thenReturn("bar");
         assertEquals("bar", foo.method());
         verify(foo).method();
 }
 assertEquals("foo", new Foo().method());

Foo 是一个新的模拟对象。但是使用 PowerMockito 的 whenNew,您可以返回一个特定的模拟对象。

PowerMockito.whenNew(Foo.class).withAnyArguments().thenReturn(mockedFoo);

有没有办法指定我想从 Mockito.mockConstruction 返回什么模拟对象?

【问题讨论】:

  • 不要试图模拟new。修复你的底层代码。

标签: java unit-testing mockito powermockito


【解决方案1】:

测试特定对象的方法之一

Class Foo {
    public Test method(){
     ....
     ....
     return test;
    }
  }

//Test
 try (MockedConstruction<Test> mocked = mockConstruction(Test.class)) {
      assertEquals(mocked.constructed().get(0), foo.method());
  }

【讨论】:

    【解决方案2】:

    我正在开发一个插件,所以我不能触及很多主应用程序的代码,但我的目标是更高的代码覆盖率。

    但是你可以添加一个答案,只要有交互,就会调用答案,你可以用它做任何你想做的事情。

       final Foo foo = mock(Foo.class);
        MockedConstruction<Foo> mockedConstruction = mockConstructionWithAnswer(Foo.class, new Answer() {
            @Override
            public Object answer(InvocationOnMock invocation) throws Throwable {
                if (invocation.getMethod().equals(Foo.getMethod("getValue"))) {
                    return "mocked value";
                }
                return foo;
            }
        });
    

    【讨论】:

      猜你喜欢
      • 2021-05-05
      • 2023-01-02
      • 1970-01-01
      • 2022-07-10
      • 2019-08-27
      • 1970-01-01
      • 2011-12-26
      • 1970-01-01
      相关资源
      最近更新 更多