如何使用模拟对象替换内部代码部分中的原始对象



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

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

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();

问题是,如何将 B 的 run(( 方法中的"a"对象替换为"mockA"对象?这样我就可以从 b.run(( 开始代码执行,还可以利用代码执行过程中的模拟对象。

任何帮助将不胜感激! :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. 创建二传手方法:

    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();
    

通常首选第二种方法。

相关内容

  • 没有找到相关文章

最新更新