java Mockito:验证传递给new的参数

lkaoscv7  于 2023-02-20  发布在  Java
关注(0)|答案(1)|浏览(222)

我正在尝试解决如何在Mockito中验证传递给模拟构造函数的参数。我的代码的简化版本是:

class Mocked {
    Mocked(String first, String second, int value) {
    }
}

class Target {
    void testMe() {
        new Mocked("Hello", "World", 99);
    }
}

@Test
public void test_Target() {
    try (
        MockedConstruction<Mocked> mockedNew = mockConstruction(Mocked.class);
    ) {
        new Target().testMe();

        Mocked mocked = mockedNew.constructed().get(0);
        // TODO: verify all arguments passed to mocked
    }
}
  • 我要测试的类是"Target"
  • Target使用了"Mocked"类的一个示例。在实际代码中,我希望使用Mocked的一个实际示例,但出于测试的目的,我希望模拟它,这样我就可以在隔离"Mocked"的情况下测试"Target"。我使用了mockConstruction构造来完成此操作。

在我的代码的最终版本中,传递给Mocked构造函数的参数不是硬编码的,相反,会有一些业务逻辑来派生它们,所以,我想验证它们是否被正确地派生出来,但是怎么做呢?
我在Google上搜索过的示例中没有一个向我展示如何做到这一点,而且org.mockito.Mockito.verify()似乎没有测试构造函数的方法。
我能看到的唯一解决方案是添加mock初始化器函数,将参数复制到局部变量中。但这涉及到使这些变量有效地成为final(final one element数组)和丑陋的强制转换。肯定有比这更好的方法!
我错过了什么?

wfveoks0

wfveoks01#

据我所知,这是不可能使用Mockito API。
您可以尝试进行设计更改,其中新的MockedFactory类负责创建Mocked对象。您可以为测试创建MockMockedFactory,并将其注入Target中以供使用。您将能够验证被测类对此工厂调用的方法。这不是最好的方法,添加了样板代码,但可以工作。
另外,我猜新创建的对象不会返回,因为测试不会成为问题。如果你正在测试的方法不是太大,一次做太多的事情,这是值得考虑的。也许其他一些重构可以帮助使它更容易测试。
或者这个:https://groups.google.com/g/mockito/c/WqPlcNrvbOw?pli=1

相关问题