在不使用模拟的情况下检查方法调用

checking method invocation without using mock

我有一个类似的系统,它从源读取数据并进行一些处理并将其信息写入数据库,并且 file.Is 可以在不创建其模拟的情况下使用某些参数检查方法调用?我知道它可以通过 Mockito 完成,但它只适用于模拟对象,不适用于真实对象。在这种情况下,我无法创建所有使用的 类 的模拟,因为内部使用了很多 类 不同的库。

例如 它发生在内部

obj.insert(Class1 param1,Class2 param2);

我想这样查

verify(obj,times(12)).insert(any(),any());

但是obj应该是Mock对象才能这样检查,不是真实的。

在使用真实对象进行测试之前需要考虑的几点。

  1. 一旦我们使用真实对象进行测试,它就不再是单元测试,而是集成测试,您将在其中使用真实的外部服务(如数据库)进行测试。
  2. 这将使您的测试通过或失败取决于外部服务可用性的状态,并且比使用模拟的正常单元测试花费更多时间。

Regarding, possible to check method invocation with certain parameters without creating its mock?

据我所知,我认为这是不可能的。

I cannot create mock of all classes used as there are lot classes of different libraries is used internally.

尽管您的 classes 可能在内部使用了很多库,但如果我们将功能设计并封装到单独的 classes 中并且被测 class 正在使用单独的classes,那么我们所要做的就是模拟那些单独的 classes,而不需要担心它正在使用的库。

在这种情况下,

a system like, reads data from a source and does some processing and writes its information to database and a file.

我认为您想对该功能进行单元测试。并假设我们已经将它们封装到单独的接口中,假设是 SourceReader(读取和处理数据)和 SinkWriter(写入数据库和文件)。我将仅模拟这两个接口并单元测试被测 class 是否在这些模拟对象上使用适当的参数调用必要的方法。

在我看来,如果系统不允许我们模拟对象,我怀疑并会考虑重构代码。因为单元测试的目标之一是促进更好的设计(尤其是基于行为的单元测试),如果我们不能轻松地进行单元测试,则意味着代码变得复杂,需要进行一些重构。