Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用模拟对象替换内部代码段中的原始对象?_Java_Junit_Mocking_Mockito - Fatal编程技术网

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

Java 如何使用模拟对象替换内部代码段中的原始对象?,java,junit,mocking,mockito,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

我在尝试执行一些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();
问题是,如何将B的run()方法中的“a”对象替换为“mockA”对象?通过这种方式,我可以从B.run()开始代码执行,也可以在代码执行过程中使用mock对象


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

有两个选项,而不是在

运行的内部创建新实例:

  • 在构造函数中传递一个实例,如

    class B {
        private A a;
        B(A a) {
            this.a = a;
        }
        void run() {
            a.test("something");
        }
    }
    
    因此,您的测试代码将更改为

    B b = new B(mockA);
    b.run();
    
    B b = new B();
    b.setA(mockA);
    b.run();
    
  • 创建setter方法:

    class B {
        private A a;
        void setA(A a) {
            this.a = a;
        }
        void run() {
            a.test("something");
        }
    }
    
    因此,您的测试代码将更改为

    B b = new B(mockA);
    b.run();
    
    B b = new B();
    b.setA(mockA);
    b.run();
    

  • 通常首选第二种方法。

    有两个选项,而不是在
    运行的内部创建新实例:

  • 在构造函数中传递一个实例,如

    class B {
        private A a;
        B(A a) {
            this.a = a;
        }
        void run() {
            a.test("something");
        }
    }
    
    因此,您的测试代码将更改为

    B b = new B(mockA);
    b.run();
    
    B b = new B();
    b.setA(mockA);
    b.run();
    
  • 创建setter方法:

    class B {
        private A a;
        void setA(A a) {
            this.a = a;
        }
        void run() {
            a.test("something");
        }
    }
    
    因此,您的测试代码将更改为

    B b = new B(mockA);
    b.run();
    
    B b = new B();
    b.setA(mockA);
    b.run();
    
  • 通常首选第二种方法