创建 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() 做其他事情。