Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.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_Mockito_Powermock_Powermockito - Fatal编程技术网

Java 测试使用私有静态类的对象列表的方法

Java 测试使用私有静态类的对象列表的方法,java,junit,mockito,powermock,powermockito,Java,Junit,Mockito,Powermock,Powermockito,我有我想测试的方法。它的输入参数是私有静态类的对象列表 Class Invoker{ public String method1(String inp){ ArrayList<InnerClass> params = new ArrayList<>(); params.add(new InnerClass("some value")); String op = method2(params); //other implementation

我有我想测试的方法。它的输入参数是私有静态类的对象列表

Class Invoker{

   public String method1(String inp){

   ArrayList<InnerClass> params = new ArrayList<>();
   params.add(new InnerClass("some value"));
   String op = method2(params);
   //other implementation
  }

   public String method2(ArrayList<InnerClass> list){

     //method implementation
  }

   private static class InnerClass {
      private String var1;

          public InnerClass(String str){
          super();
          this.str = str;
         }
   }
}
类调用程序{
公共字符串方法1(字符串输入){
ArrayList params=新的ArrayList();
参数add(新的内部类(“某些值”);
字符串op=method2(参数);
//其他实施
}
公共字符串方法2(ArrayList列表){
//方法实现
}
私有静态类InnerClass{
私有字符串var1;
公共内部类(字符串str){
超级();
this.str=str;
}
}
}

现在,我想为方法“method1”编写一个测试用例。我面临的问题是,在测试时,我无法在测试类中创建ArrayList。

您在这里遇到了错误的麻烦

将内部类设置为私有将向读者(和编译器顺便说一句)传达这样一个信息:中的这个内部类只打算在外部封闭类中使用。故事结束了

因此,在公共方法的签名中使用类名根本没有意义

当然,从理论上讲,您可以使用它来解决这个问题(直到Java9模块进入您的方式),但正如所说的:这样做是浪费时间


如果你需要使用课外活动,不要让它们成为私人活动。所以考虑把它们包装起来保护。然后,同一个包中的用户可以访问,因此单元测试应该存在于同一个包中)。

method1已经为您创建了此功能。测试“method21”时只会遇到这个问题,它应该是私有的,因为InnerClass可能是私有的。如果调用方根本看不到类,那么如何调用public
method2
?PeterLawrey我想在method1的测试用例中写为:
when(spy.method2(list))。然后返回(“一些字符串”)
因此无法创建ArrayList列表。为了清楚起见,我正在用另一个类编写所有测试用例。如果您觉得用这种方法测试这个方法是有效的,我建议将内部类包设置为本地,并在该包中创建一个测试。如果您觉得它应该是私有的,那么使用直接测试它。我正在为一些遗留代码编写测试用例。现在没有办法修改它,那么您可以尝试反射。但是,当您首先不允许修改代码时,测试代码的意义是什么。当您发现错误时会发生什么?您也不能使用“车辆”之类的测试“稍后测试重新实现-因为任何使用反射的东西都直接基于实现细节,因此重新实现很容易破坏此类测试。