如何在不创建新对象的情况下测试私有成员对象

我正在尝试针对一个类编写单元测试。我无法更改课程,但我认为可以使用反射进行测试。我只是不知道该怎么做。这是课程:


public class MyClass extends AnotherClass implements TheInterface

{

    private enum SomeTypes

    {

        SAMPLE01, SAMPLE02, SAMPLE03

    }


    private CircularList<SomeTypes> someTypesList; 

    Date date= new Date();

    private SomeOtherClassProcessor01 someOtherClassProcessor01;

    private SomeOtherClassProcessor02 someOtherClassProcessor02;

    private SomeOtherClassProcessor03 someOtherClassProcessor03;


    public Properties initialize (Properties properties) throws Exception

    {

        Properties propertiesToReturn = super.initialize(properties);

        someTypesList = new CircularList<SomeTypes>    (Arrays.asList(SomeTypes.values())); 

        someOtherClassProcessor01 = new SomeOtherClassProcessor01(); 

        someOtherClassProcessor02 = new SomeOtherClassProcessor02(); 

        someOtherClassProcessor03 = new SomeOtherClassProcessor03(); 


        return propertiesToReturn;

    }


    @Override

    public void get(ImportedClass someParams) throws Exception

    {

        SomeTypes types = someTypesList.getFirstAndRotate();


        switch(types)

        {

            case SAMPLE01:

            someOtherClassProcessor01.doSomething(someParams,     date);

            break;

            case SAMPLE02:

            someOtherClassProcessor02.doSomething(someParams,     date);

            break;

            case SAMPLE03:

            someOtherClassProcessor03.doSomething(someParams,     date);

            break;

            default:

            throw new IllegalArgumentException("This " + types + "     was not implemented.");

        }

    }   

}

是否可以为此使用白盒?我需要确保在这些对象的 getter 中有一个调用。我应该尝试 when(someOtherClassProcessor01.doSomething(any(), date)).thenReturn(true) 之类的东西吗?如果您需要更多详细信息,请告诉我。

胡子哥哥
浏览 108回答 1
1回答

尚方宝剑之说

一种选择是将您自己的(模拟的)实现替换SomeOtherClassProcessor为MyClass使用反射:MyClass myClass = new MyClass();SomeOtherProcessor01 mockProcessor01 = mock(SomeOtherProcessor01.class);// reflection bit: find the field by its name// handle NoSuchFieldExceptionField someProcessorField = MyClass.getDeclaredField("someOtherProcessor01");// the field is declared as private, so make it accessible in order to work with itsomeProcessorField.setAccessible(true);// now set your mocked processor into the field.&nbsp;// First argument is the object to change; second argument - new value for the fieldsomeProcessorField.set(myClass, mockProcessor01);附言。使用 PowerMock 和/或反射是向糟糕的设计投降(根据 Timothy :)。您不应该依赖尚未经过充分测试的代码,如果是,您不应该再次尝试对其进行测试。假设您的测试实际上揭示了一个错误——如果您不控制代码,您将如何修复它?假设 Java 11 变成了一个东西,禁止你使用反射。假设您正在测试的代码发生变化并且字段被重命名 - 通过反射,您没有编译时安全......潜在问题列表继续
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java