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

标签 java junit mocking mockito

当我尝试执行一些 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() 开始执行代码并在代码执行过程中利用模拟对象。

任何帮助将不胜感激! :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();
    

通常首选第二种方法。

关于java - 如何使用模拟对象替换内部代码部分中的原始对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48070184/

相关文章:

java - 在多个设备上运行移动测试

java - 如何在 void 方法 SUT Mockito 中获取对象值

testing - 模拟 bufio.NewScanner 的标准输出流

java - 编写返回 void 的方法是一种好习惯吗?

javax.validation 不存在

java - Jetty 9 HTTP客户端: How to get the request content?

c# - 测试 Exchange Web 服务 API 的最佳策略

phpunit mock 方法多次调用不同参数

java - 在 Selenium Java 中需要这些(Firefox)浏览器配置文件设置的 chrome 等价物

java - 模拟静态无效方法并改变其行为