当前位置: 首页 > 知识库问答 >
问题:

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

段干跃
2023-03-14

我有以下类要用模拟私有对象创建进行测试,

    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个答案

上官扬
2023-03-14

我的答案分为三个部分。

首先,不能用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);
 类似资料:
  • 如何模拟dao.create()调用?

  • 我试图为这样的函数编写一个单元测试: 为了测试这段代码,我需要模拟服务,因为它调用类外的函数,但问题是它是私有的。 我该如何用玩笑来模拟一个私有变量呢?这个类创建了它自己的实例,所以甚至可以模仿它吗?

  • 我有以下场景: 我想在测试中覆盖公共方法methodA()的catch块。我不想更改私有方法的可见性。是否有任何方法可以使用EasyMock实现私有方法的部分模拟?或者有没有办法改变Junit类中私有方法的行为,以便在不使用mocking的情况下抛出异常? 提前谢谢。

  • 问题内容: 我正在使用EasyMock编写许多协作类的单元测试。这些类之一(称为)打开了到远程服务器的网络连接,并将该服务器的XML响应解析为其余类可以使用的东西。 目前,我的测试仅涉及所有情况都是笨拙且远程服务器已启动并正在运行并按预期返回XML的情况。但是,如果可以进行模拟,以便模拟远程服务器关闭或发生其他问题导致抛出,该怎么办,我 会 更高兴。 我看过EasyMock API,但看不到任何看

  • 我有一个接一个的类来测试模拟对象。 我的测试: Test01工作正常,但在Test02中我有问题。在Test02方法中,需要调用进程路径。它使用mockNetwork公共最终变量。我不知道在哪里设置它们。它导致了空异常。在上面的代码中,我试图更改此字段的可访问性并设置它们,但现在我在消息“sinkIndex”中出现错误。 如何在mockNetwork中模拟公共最终变量?我正在使用Easymock。

  • 我试图模拟Scala单例对象。特别是,我需要模拟对象在服务组件(测试中的类)中使用。使用Mockito这是不可能的,测试执行会以以下方式失败: 在这里阅读,Scalamock似乎允许这样做: 要模拟独立的单例对象,请使用。 我的服务组件是这样的: 我的build.sbt有所有这些依赖关系: 但是我找不到这个: 也许这也可以使用EasyMock和PowerMock实现,但我找不到任何Scala示例代