有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java EasyMock如何模拟私有对象实例化和变量

我有下面的类要用模拟私有对象创建来测试

    class TestClass {

    private Dialog dialog;

    private DialogChangeListener listener = new DialogChangeListener() {
        public void onChange(Event e) {
            String v = e.getValue();
            if (condition1) {
                // perform operation 1
            } else if (condition2) {
                // perform operation 2
            } else if (condition3) {
               // perform operation 3
            }
        }
    }

    public void openDialog() {
        if (condition1) {
            dialog = new Dialog(arg1, arg2, listener);
        } else if (condition2) {
            dialog = new Dialog(arg1, arg2, arg3, listener);
        } else if (condition3) {
            dialog = new Dialog(arg1, arg2, arg3, listener);
        }
    }
}

在上面的场景中,如何使用EasyMock模拟私有“Dialog”变量及其实例化以及私有“listener”变量,以便在有条件的基础上继续其余操作


共 (1) 个答案

  1. # 1 楼答案

    我的答案有三个部分

    首先,不能用EasyMock模拟属性和实例化。这些情况很少需要,这意味着您应该重构

    其次,PowerMock可以模拟实例化。它很强大,但我自己从来没有用过

    第三,就你而言

    1. 我将添加一个构造函数,该构造函数接受listener in参数。很容易嘲笑它
    2. 执行部分模拟并将对话框创建提取到特定方法中。这是如果你真的需要保持创作在那里。否则,我就把它搬到某个工厂去嘲笑它

    代码示例:

    public void openDialog() {
        if (condition1) {
            dialog = createDialog(listener, arg1, arg2);
        } else if (condition2) {
            dialog = createDialog(listener, arg1, arg2, arg3);
        } else if (condition3) {
            dialog = createDialog(listener, arg1, arg2, arg3);
        }
    }
    
    /* default scope to make it mockable */ Dialog createDialog(DialogChangeListener listener, Object... args) {
        //...
    }
    

    然后测试:

    TestClass testClass = EasyMock.partialMockBuilder(TestClass.class)
            .addMockedMethod("createDialog")
            .createMock();
    expect(testClass.createDialog(listener, ...)).andReturn(someDialog);