Java 模拟类的所有实例
我知道这是一个典型的坏习惯,但在我的情况下,这是必要的 我有一个例子,枚举持有一个类以获得一些信息。因此,枚举在其构造函数中创建该CALS的实例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
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)