Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.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 新实例上的Mock方法_Java_Mockito_Junit5 - Fatal编程技术网

Java 新实例上的Mock方法

Java 新实例上的Mock方法,java,mockito,junit5,Java,Mockito,Junit5,我正在尝试使用Mockito框架和junit5创建Junit测试用例。我正在编写以下代码: Class ClasstToBeTested { FirstClass a = new FirstClass(); public String methodToBeTested() { String str = a.firstMethod(); return str; } } Class FirstClass

我正在尝试使用Mockito框架和junit5创建Junit测试用例。我正在编写以下代码:

    Class ClasstToBeTested {
      FirstClass a = new FirstClass();

      public String methodToBeTested() {
         String str = a.firstMethod();
         return str;
      }
    }

   Class FirstClass {
      SecondClass b = new SecondClass();

      public String firstMethod() {
          String str = b.secondMethod();
          return str;
      }
   }
我有一个像上面这样的类结构,我需要模拟secondMethod

我尝试了@spy-on-FirstClass并模拟了SecondClass和secondMethod,但模拟没有发生。在这种情况下,我怎么能嘲笑

注意-我无法更改该类的结构。

您有一些选择:

  • (首选)使用IoC依赖项注入来提供
    第二类
    实例,而不是在
    第一类
    中构建它:
  • class头等舱{
    私立二等b班;
    //注入第二类实例
    财政类(乙类){
    这个.b=b;
    }
    公共字符串方法(){
    String str=b.secondMethod();
    返回str;
    }
    }
    
    然后您可以在测试中注入一个mock

  • 为测试添加一个
    SecondClass
    setter
  • class头等舱{
    SecondClass b=新的SecondClass();
    //如果可用,使用测试注释的可见性进行注释。
    //这里也可以注入模拟,但如果不小心使用,可能会导致问题。
    无效设置SecondClassforTests(二级b){
    这个.b=b;
    }
    公共字符串方法(){
    String str=b.secondMethod();
    返回str;
    }
    }
    
    然后在测试中调用setter并通过模拟

  • 使用反射获取字段并设置模拟。类似于(在测试函数中):

  • 你能改变你的班级结构吗?模拟不会以这种方式工作,至少对于
    Mockito
    。它们是遗留的,我将无法修改类结构。与Powermock有关吗?是的,请查看
    Powermock::whenNew
    final Field declaredField = instanceOfFirstClass.getClass().getDeclaredFields("b");
    declaredField.setAccessible(true);
    declaredField.set(instanceOfFirstClass, yourMockedInstance);