【问题标题】:Mock all instances of a class模拟一个类的所有实例
【发布时间】:2013-12-27 08:31:25
【问题描述】:

我知道这通常是一种不好的做法,但就我而言,这是必要的。

我有一个例子,一个 Enum 持有一个类来获取一些信息。这样 Enum 就会在其构造函数中创建该类的实例。

public enum MyEnum {
    CONSTANT(new MyImpl());

    private final MyImpl myImpl;

    private MyEnum(final MyImpl impl) {
        this.myImpl = impl;
    }

    public void sayHello() {
        System.out.println(this.myImpl.getSomethingToSay());
    }

}

MyImpl.java 只是一个类,它只有一个返回字符串的方法。

public class MyImpl {

    public String getSomethingToSay() {
        return "Hello!";
    }

}

现在终于单元测试了:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.testng.PowerMockTestCase;

@RunWith(MockitoJUnitRunner.class)
@PrepareForTest({ MyImpl.class, MyEnum.class })
public class MyEnumTest extends PowerMockTestCase {
    @Test
    public void testSmth2() throws Exception {
        MyImpl impl = Mockito.mock(MyImpl.class);
        Mockito.when(impl.getSomethingToSay()).thenReturn("It works!");
        PowerMockito.whenNew(MyImpl.class).withAnyArguments().thenReturn(impl);

        System.out.println(impl.getSomethingToSay());
        System.out.println(new MyImpl().getSomethingToSay());
        MyEnum.CONSTANT.sayHello();
    }
}

输出是:

It works!
Hello!
Hello!

但应该是3次才行!

【问题讨论】:

  • 即使您可以根据需要多次使用whenNew,如果您可以指定 before 初始化枚举,它仍然会有所帮助 -如果你能做到这一点,它将以这种方式用于 all 测试,直到你得到一个新的类加载器。我真的会尝试重新设计它 - 从枚举中模拟依赖项真的非常讨厌。
  • 但是当我将模拟块移动到静态块中时,System.out.println(new MyImpl().getSomethingToSay()); 仍然会返回Hello!
  • 我不太确定这有什么关系...
  • 我误解了你的第一条评论。好吧,那么嘲笑 Enum 本身呢?
  • PowerMock 是否允许您模拟枚举?即使是这样,我也不认为这是一个好主意。

标签: java unit-testing mocking mockito enumeration


【解决方案1】:

我找到了有问题的部分。

我变了

@RunWith(MockitoJUnitRunner.class)

@RunWith(PowerMockRunner.class)

现在模拟工作了。但我不得不说,正如 Jon Skeet 打印出来的那样,枚举并没有到处都有嘲笑的成员实例。所以在另一个单元测试中调用MyEnum.CONSTANT.sayHello(); 将再次打印it works 而不是Hello!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 2016-05-13
    相关资源
    最近更新 更多