被测单元有一行实例化一个类的代码,而且该类的构造方法需要参数。基于面向单元测试编程的原则,通过容器的makeWith()方法实现:
|
|
但是在执行单元测试时发现,虽然测试代码中已经mock了这个类且注入到容器,但在被测单元中取到的还是原类的实例。
实际上,测试代码中在将mock的实例注入容器时使用的是instance()方法:
|
|
而容器在取带构造参数的类的实例时,并不取通过instance()方法注册进来的实例:
|
|
当存在构造参数时,容器认为是“上下文相关的构造”(needsContextualBuild),所以尝试通过具体的(concrete)逻辑实时构造。
进一步地,getConcrete()方法的实现如下:
|
|
它从bindings数组中获取构造逻辑。因此,可以将测试代码中注册被mock的实例的方法改成如下所示:
|
|
因为offsetSet()方法就是通过bind()方法把被mock的实例注册到容器的:
|
|