Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 模拟类的所有实例_Java_Unit Testing_Mocking_Mockito_Enumeration - Fatal编程技术网

Java 模拟类的所有实例

Java 模拟类的所有实例,java,unit-testing,mocking,mockito,enumeration,Java,Unit Testing,Mocking,Mockito,Enumeration,我知道这是一个典型的坏习惯,但在我的情况下,这是必要的 我有一个例子,枚举持有一个类以获得一些信息。因此,枚举在其构造函数中创建该CALS的实例 public enum MyEnum { CONSTANT(new MyImpl()); private final MyImpl myImpl; private MyEnum(final MyImpl impl) { this.myImpl = impl; } public void sa

我知道这是一个典型的坏习惯,但在我的情况下,这是必要的

我有一个例子,枚举持有一个类以获得一些信息。因此,枚举在其构造函数中创建该CALS的实例

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倍

我找到了有故障的零件

我变了

@RunWith(MockitoJUnitRunner.class)


现在嘲弄起作用了。但我必须说,正如Jon Skeet打印出来的那样,enum并没有在所有地方都有模拟成员实例。所以在另一个单元测试中调用
MyEnum.CONSTANT.sayHello()
将再次打印
它工作
而不是
您好

即使您可以在新的
whenNew
中使用任意次数,但只有在初始化枚举之前指定它,它仍然会有所帮助-如果您可以这样做,它将以这种方式用于所有测试,直到您获得新的类加载器。我真的会尝试重新设计它-从枚举模拟依赖项真的非常讨厌。但是当我在静态块中移动模拟块时,
System.out.println(new MyImpl().getSomethingToSay())仍将返回
你好我不太确定这有什么关系…我误解了你的第一个评论。好吧,那模仿枚举本身呢?PowerMock允许你模仿枚举吗?即使这样,我也不认为这是个好主意。
@RunWith(PowerMockRunner.class)