Zar*_*tra 11 java unit-testing enumeration mocking mockito
我知道这通常是一种不好的做法,但就我而言,这是必要的.
我有一个案例,Enum持有一个类来获取一些信息.这样Enum就可以在其构造函数中创建该calss的实例.
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());
}
}
Run Code Online (Sandbox Code Playgroud)
MyImpl.java 只是一个具有返回String的单个方法的类.
public class MyImpl {
public String getSomethingToSay() {
return "Hello!";
}
}
Run Code Online (Sandbox Code Playgroud)
现在最后进行单元测试:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
输出是:
It works!
Hello!
Hello!
Run Code Online (Sandbox Code Playgroud)
但它应该是它的3倍!
我找到了有缺陷的部分.
我变了
@RunWith(MockitoJUnitRunner.class)
Run Code Online (Sandbox Code Playgroud)
至
@RunWith(PowerMockRunner.class)
Run Code Online (Sandbox Code Playgroud)
现在嘲弄工作.但我不得不说,当Jon Skeet打印出来时,枚举并没有到处嘲笑成员实例.所以在另一个单元测试中,MyEnum.CONSTANT.sayHello();将再次打印调用it works而不是Hello!.
| 归档时间: |
|
| 查看次数: |
16375 次 |
| 最近记录: |