如何使用mock对象替换内部代码段中的原始对象?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用mock对象替换内部代码段中的原始对象?相关的知识,希望对你有一定的参考价值。

当我尝试执行一些JUnit mockito测试时遇到了这个问题。

为了便于理解我的问题,我将在下面提供一个示例:

Class A {
   public String test(String para1) {
       //...do whatever stuff
       return para1;
   }
}

Class B {
   public void run() {
       A a = new A();
       String result = a.test("test");
       System.out.println(result);
   }
}

when(mockA.test(anyString()).thenReturn("mockResult");

A mockA = mock(A.class);

//Instead of doing mockA.test(), I do the following:
B b = new B();
b.run();

问题是,如何用“mockA”对象替换B的run()方法中的“a”对象?这样我就可以从b.run()开始代码执行,并且还可以利用代码执行过程中的mock对象。

任何帮助将不胜感激! :P

答案

有几个选项,而不是在run中创建A的新实例:

  1. 在构造函数中传递A的实例,如 class B { private A a; B(A a) { this.a = a; } void run() { a.test("something"); } } 所以你的测试代码将改为 B b = new B(mockA); b.run();
  2. 创建setter方法: class B { private A a; void setA(A a) { this.a = a; } void run() { a.test("something"); } } 所以你的测试代码将改为 B b = new B(); b.setA(mockA); b.run();

通常第二种方法是优选的。

以上是关于如何使用mock对象替换内部代码段中的原始对象?的主要内容,如果未能解决你的问题,请参考以下文章

接口自动化测试之Mock

前段如何用mock返回对象

Mock单元测试

动态替换Spring容器中的Bean

使用PowerMockito.whennew的时候,注解preparefortest里面的类需要是mock的new代码所在的类的对象

使用 Python Mock 库监视内部方法调用