【问题标题】:Mock enum instantiation using powermock使用 powermock 模拟枚举实例化
【发布时间】:2013-02-19 16:13:21
【问题描述】:

我有以下代码要测试:

Public MyClass() {

    public static final boolean myFunc(int param1, String param2, long param3) {

        SomeInterface var1 = SomeEnumImplementingSomeInterface.INSTANCE;
        SomeOtherInterface var2 = var1.getInstanceOfSomeOtherInterface();

        String str = var2.getValue();

        if (str.equals("ABCD"))
            return true;
        else 
            return false;
    }
}

有什么方法可以在这里将模拟对象分配给 var1 吗?

我能想到的一种解决方法是将 var1 声明为类变量(在这种情况下它必须是静态的,因为访问它的方法是静态的),然后通过白盒将模拟对象分配给它。但我不想仅仅为了测试而改变设计。

请避免建议我更改课程设计。

【问题讨论】:

  • 看起来您正在尝试测试 var1.getInstanceOfSomeOtherInterface() 方法返回的任何内容。为什么需要模拟枚举?
  • 最好设计类以便于测试
  • @BheshGurung 我正在尝试测试var2.getValue() 返回的值。我过度简化了实际的课程。其他一些值正在传递给这个 getValue() 函数。

标签: java unit-testing junit easymock powermock


【解决方案1】:

您可以使用包或受保护的方法来设置 var1 值,并且在您的测试中,如有必要,您可以覆盖您的类来设置模拟对象,类似于:

public MyClass() {

    public static final boolean myFunc(int param1, String param2, long param3) {

        SomeInterface var1 = getVar1();
        SomeOtherInterface var2 = var1.getInstanceOfSomeOtherInterface();

        String str = var2.getValue();

        if (str.equals("ABCD"))
            return true;
        else 
            return false;
    }

    SomeInterface getVar1() {
        return SomeEnumImplementingSomeInterface.INSTANCE;
    }
}

public MyClassTest {

    private MyClass myClassUnderTest = new MyClass() {
        @Override
        SomeInterface getVar1() {
            return SomeEnumImplementingSomeInterface.INSTANCE;
        }
    } 

    public void testMyFunc() {
        // do test stuff with myClassUnderTest
    }
}

【讨论】:

  • 感谢 greuze 的回复。但我无法访问这些界面。这些实际上是暴露给我的 API。我想知道是否有某种方法可以将 var1 的值设置为其他值?
  • 没看懂,没改任何界面。你的意思是你不能修改类 MyClass?
  • 很抱歉在这里造成了混乱。我的意思是我不想改变班级。 getVar1() 必须只是为了测试而创建。还有其他出路吗?
  • 如果你不想修改类,你可以复制/粘贴功能来测试(非常糟糕的设计)或修改字节码以设置不同的值(也非常糟糕的设计)。当你设计一个类时,你应该准备好让它易于测试。如果您基于具体实现进行测试,并在具体行中进行具体分配,那么当有人修改类时,您的测试将崩溃(即使功能仍然可以,例如更改变量名)。
  • 我建议您使用“set”方法(使用包或受保护的访问),因此您必须只关注类应该具有的行为(而不是它如何做这些事情)。如果您使用的是 TDD,则应在创建要测试的类之前创建测试,这样您就可以确定您正在测试该类必须做什么,而不是如何测试。
猜你喜欢
  • 1970-01-01
  • 2015-07-19
  • 2013-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-30
相关资源
最近更新 更多