为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

胡子哥哥 2023-06-04 14:55:53
我正在尝试针对一个类编写单元测试。我无法更改课程,但我认为可以使用反射进行测试。我只是不知道该怎么做。这是课程: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) 之类的东西吗?如果您需要更多详细信息,请告诉我。
查看完整描述

1 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

一种选择是将您自己的(模拟的)实现替换SomeOtherClassProcessor为MyClass使用反射:


MyClass myClass = new MyClass();

SomeOtherProcessor01 mockProcessor01 = mock(SomeOtherProcessor01.class);


// reflection bit: find the field by its name

// handle NoSuchFieldException

Field someProcessorField = MyClass.getDeclaredField("someOtherProcessor01");

// the field is declared as private, so make it accessible in order to work with it

someProcessorField.setAccessible(true);

// now set your mocked processor into the field. 

// First argument is the object to change; second argument - new value for the field

someProcessorField.set(myClass, mockProcessor01);

附言。使用 PowerMock 和/或反射是向糟糕的设计投降(根据 Timothy :)。您不应该依赖尚未经过充分测试的代码,如果是,您不应该再次尝试对其进行测试。假设您的测试实际上揭示了一个错误——如果您不控制代码,您将如何修复它?假设 Java 11 变成了一个东西,禁止你使用反射。假设您正在测试的代码发生变化并且字段被重命名 - 通过反射,您没有编译时安全......潜在问题列表继续


查看完整回答
反对 回复 2023-06-04
  • 1 回答
  • 0 关注
  • 107 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信