创建 Junit 时如何设置在私有内部 class 中引用的对象?
How to set object that is being refereed in private inner class while creating Junit?
我有2个java类.
1) class1.java
public class class1
{
private class ParameterVariable
{
class2 c1;
String s;
ParameterVariable(String s)
{
this.s =s;
}
}
public void methodToTest(String s)
{
try
{
ParameterVariable pv = new ParameterVariable(s)
if(StringUtils.isNotEmpty(pv.c1.getPartNo()))
{
// Some Code
}
}
finally
{
// Some code
}
}
}
2) class2.java
public class class2
{
// pojo class
String partNo;
public String getPartNo()
{
return partNo;
}
public void setPartNo(String partNo)
{
this.partNo = partNo;
}
}
现在我想为我的方法创建一个 Junit 测试用例。我无法获取 class2 对象的运行时值。
这是我的作品
private class1 = null;
protected Object createParamterVariableObject ( String s ) throws ClassNotFoundException, InstantiationException,
IllegalAccessException, InvocationTargetException,
NoSuchMethodException, SecurityException
{
Class clazz = Whitebox.getInnerClassType(class1.class, "ParameterVariable");
Constructor constructorForParameterVariable = clazz.getConstructor(String.java)
Object parameterVariableObject = constructorForParameterVariable.newInstance(String.java)
return parameterVariableObject;
}
@Test
public void junitTestCase() throws Exception
{
String s = "Sample";
Class clazz = null;
Object parameterVariableObject = null;
class2 cls2Object = new clsObject;
try
{
parameterVariableObject = createParamterVariableObject(s);
clazz = Whitebox.getInnerClassType(SupersedeImpl.class, "ParameterVariable");
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
class2 c2Object = new class2();
c2Object.setPartNo("NEW_PART_NO");
Field C1Field = (Field) parameterVariableObject.getClass().getDeclaredField("c1");
C1Field.set(parameterVariableObject, C1Field);
PowerMockito.whenNew(clazz).withArguments(s).thenReturn(parameterVariableObject);
class1 = PowerMockito.spy(class1);
class1.methodToTest(s);
// some assertion
}
我想为第 2 类对象的部分设置一些模拟值。
因为我的方法是基于它的。
我使用这些代码得到空值。你能帮帮我吗?
我的建议:让您的生活更轻松:
- 将 inner class 更改为正常的 class
- 创建一个工厂 returns 个 class
的实例
然后使用依赖注入将这样一个工厂给你的class测试。并使用任何普通的模拟框架来创建这些对象。
完成。你不仅避免了所有那些使你的版本中的模拟复杂化的问题;您最终还会得到耦合度较低的代码。
你可以模拟对象class2 c1试试,
在您的代码中必须有 setter 注入对象的方法。
您可以在 JUnit 测试用例中使用它来 return 模拟对象。
即通过 doReturn().. when()..
之后,您将在代码中获得模拟对象。
你可以使用 when().. then() 做其他事情。
我有2个java类.
1) class1.java
public class class1
{
private class ParameterVariable
{
class2 c1;
String s;
ParameterVariable(String s)
{
this.s =s;
}
}
public void methodToTest(String s)
{
try
{
ParameterVariable pv = new ParameterVariable(s)
if(StringUtils.isNotEmpty(pv.c1.getPartNo()))
{
// Some Code
}
}
finally
{
// Some code
}
}
}
2) class2.java
public class class2
{
// pojo class
String partNo;
public String getPartNo()
{
return partNo;
}
public void setPartNo(String partNo)
{
this.partNo = partNo;
}
}
现在我想为我的方法创建一个 Junit 测试用例。我无法获取 class2 对象的运行时值。 这是我的作品
private class1 = null;
protected Object createParamterVariableObject ( String s ) throws ClassNotFoundException, InstantiationException,
IllegalAccessException, InvocationTargetException,
NoSuchMethodException, SecurityException
{
Class clazz = Whitebox.getInnerClassType(class1.class, "ParameterVariable");
Constructor constructorForParameterVariable = clazz.getConstructor(String.java)
Object parameterVariableObject = constructorForParameterVariable.newInstance(String.java)
return parameterVariableObject;
}
@Test
public void junitTestCase() throws Exception
{
String s = "Sample";
Class clazz = null;
Object parameterVariableObject = null;
class2 cls2Object = new clsObject;
try
{
parameterVariableObject = createParamterVariableObject(s);
clazz = Whitebox.getInnerClassType(SupersedeImpl.class, "ParameterVariable");
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
class2 c2Object = new class2();
c2Object.setPartNo("NEW_PART_NO");
Field C1Field = (Field) parameterVariableObject.getClass().getDeclaredField("c1");
C1Field.set(parameterVariableObject, C1Field);
PowerMockito.whenNew(clazz).withArguments(s).thenReturn(parameterVariableObject);
class1 = PowerMockito.spy(class1);
class1.methodToTest(s);
// some assertion
}
我想为第 2 类对象的部分设置一些模拟值。 因为我的方法是基于它的。 我使用这些代码得到空值。你能帮帮我吗?
我的建议:让您的生活更轻松:
- 将 inner class 更改为正常的 class
- 创建一个工厂 returns 个 class 的实例
然后使用依赖注入将这样一个工厂给你的class测试。并使用任何普通的模拟框架来创建这些对象。
完成。你不仅避免了所有那些使你的版本中的模拟复杂化的问题;您最终还会得到耦合度较低的代码。
你可以模拟对象class2 c1试试, 在您的代码中必须有 setter 注入对象的方法。 您可以在 JUnit 测试用例中使用它来 return 模拟对象。 即通过 doReturn().. when().. 之后,您将在代码中获得模拟对象。 你可以使用 when().. then() 做其他事情。