【问题标题】:How to test static void functions using Powermock easyMock?如何使用 Powermock easyMock 测试静态 void 函数?
【发布时间】:2018-07-11 07:32:59
【问题描述】:

我有一个返回 void 的静态函数。

此函数执行一些操作并在内部填充地图。

这样的……

public static void doSomething(arg1,arg2,arg3) {
    //Do some processing with the input parameters

    if(arg1 satisfies given condition) {
        //Create object
        Conn conn = new Conn()

        Map<String, List<String>> map = new Map();

        //Populate the map with the processed value

        conn.setAttributes(map);
    }
}

现在我想测试是否满足条件是否满足“conn”对象中的“map”是否填充了预期值? 在这方面需要帮助。

【问题讨论】:

  • 能否请您编辑帖子以便进行测试?在这里查看更多信息 -> stackoverflow.com/help/mcve
  • 我无法发布确切的代码,我只能说,这是我面临的场景,我需要为此编写测试用例。我怎样才能做到这一点?
  • 我也不需要确切的测试用例,只是一种接近的方法。
  • 嗯,用 JUnit 测试像你这样的方法并不难,你只需在 Junit 类中创建一个 @Test 注释。问题是不清楚你的问题到底是什么。我不明白你在问什么。如何使用Junit?
  • 我有这个 doSomething 方法,它不返回任何东西,它只在满足 if 条件时用 setAttribute 方法更新 conn 对象。我想测试条件是否满足'conn'对象属性应该设置否则不。

标签: java junit powermock easymock


【解决方案1】:

这里的问题是隐藏的依赖Conn 对象的实例化。

根据经验,业务代码不应负责获取必须与之通信的依赖项。

您有两种解决方案:

  1. 屈服于你糟糕的设计并使用 Powermock 注入 Conn 的 Mock。

  2. 改进您的设计并使用依赖注入/控制反转

    这可以通过简单地将Conn 对象的内部实例替换为Conn 类型的附加参数来完成。

    但更好的方法是将static 方法转换为常规的非静态成员方法,并将Conn 的实例作为构造函数参数传递给private final 成员变量。

    鉴于该类 Conn 不是 final,您可以使用常规模拟框架来创建 Conn 的模拟并在您的单元测试中使用它。

【讨论】:

  • 解决方案 2 是毫无疑问的,因为我无权更改设计(业务法规)。现在来到解决方案 1,我已经尝试过了,但我想执行一些断言,例如..."assert(conn.getAttributes.containsKey("key"));"我已经模拟了“doSomething”可用的类并模拟了所有必需的参数,但我不确定如何检索该 conn 对象,以便可以在我的断言中使用它,如图所示。
  • @NaveenYadav “解决方案 2 没有问题,因为我无权更改设计(业务规则)。” 然后您应该向项目经理上报此设计很脆,可能会减慢未来的发展。此外,您应该向她说明,编写 UnitTests开发人员的任务,而不是“专门的测试人员”应该做的事情。我知道这会带来麻烦,但作为专业人士,您应该努力改进代码库。
  • @NaveenYadav “现在来看解决方案 1” 我知道这会导致投票失败,但我强烈反对使用 PowerMock。而且由于我自己不使用它,我既不能也不想在这里提供帮助。
猜你喜欢
  • 2012-07-27
  • 1970-01-01
  • 1970-01-01
  • 2017-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-30
  • 1970-01-01
相关资源
最近更新 更多