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列表。为了清楚起见,我正在用另一个类编写所有测试用例。如果您觉得用这种方法测试这个方法是有效的,我建议将内部类包设置为本地,并在该包中创建一个测试。如果您觉得它应该是私有的,那么使用直接测试它。我正在为一些遗留代码编写测试用例。现在没有办法修改它,那么您可以尝试反射。但是,当您首先不允许修改代码时,测试代码的意义是什么。当您发现错误时会发生什么?您也不能使用“车辆”之类的测试“稍后测试重新实现-因为任何使用反射的东西都直接基于实现细节,因此重新实现很容易破坏此类测试。