Java 电源模拟单元测试具有 Thread.Sleep 的方法
Java power mock unit test a method having Thread.Sleep
我正在尝试对调用 Thread.sleep.
的方法进行单元测试
public Boolean waitForUpscale(){
String res = someObject.upTheResources();
Thread.sleep(20000);
Boolean status = someObject.checkForStatus();
return status;
}
在测试这个时,测试也会因为Thread.sleep
而睡眠,我必须在测试时避免测试进入睡眠状态。
更新:
我添加了这个测试:
@Test
public void downscaleTest() throws Exception {
when(someservice.downScaleResources()).thenReturn("DONE");
PowerMockito.mockStatic(Thread.class);
doNothing().when(Thread.class, "sleep", anyLong());
Boolean res = Whitebox.invokeMethod(myController, "downscaleALL");
assertTrue(res);
}
当我调试它时它起作用了。但是当我 运行 测试正常时,它没有给出以下异常:
0 matchers expected, 1 recorded:
-> at com.mypackage.controller.MyController.downscaleALL(MyControllerTest.java:265)
This exception may occur if matchers are combined with raw values:
//incorrect:
someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
//correct:
someMethod(anyObject(), eq("String by matcher"));
For more info see javadoc for Matchers class.
添加 downScaleAll 方法
private Boolean downscaleALL() {
try {
String downScaleResources = someservice.downScaleResources();
if (downScaleResources.equals("DONE")) {
Thread.sleep(20000); // 20s
log.info("DOWNSCALING THE RESOURCES NOW");
return true;
}
return false;
} catch (Exception e) {
log.error("Error while downscaling the resources");
log.error(e.toString());
return false;
}
}
你应该只 mock types you own 所以,如果你想模拟对 Thread.sleep()
的调用,你应该将其提取到你拥有的类型中(例如 ThreadSleeper
),因此可以模拟.更好的是,如果可以的话,重写以避免睡眠。睡眠通常是一种代码气味(偷工减料)。
我同意@Elevate 提到的,你不应该模拟你不拥有的类型。但是如果你还要做,你可以这样做
@RunWith(PowerMockRunner.class)
@PrepareForTest({<ClassWherewaitForUpscaleFunctionisLocated>.class, Thread.class})
public class Mytest {
@Test
public void testStaticVoid() throws Exception {
PowerMockito.mockStatic(Thread.class);
doNothing().when(Thread.class, "sleep", anyLong());
.........
}
}
我正在尝试对调用 Thread.sleep.
的方法进行单元测试public Boolean waitForUpscale(){
String res = someObject.upTheResources();
Thread.sleep(20000);
Boolean status = someObject.checkForStatus();
return status;
}
在测试这个时,测试也会因为Thread.sleep
而睡眠,我必须在测试时避免测试进入睡眠状态。
更新:
我添加了这个测试:
@Test
public void downscaleTest() throws Exception {
when(someservice.downScaleResources()).thenReturn("DONE");
PowerMockito.mockStatic(Thread.class);
doNothing().when(Thread.class, "sleep", anyLong());
Boolean res = Whitebox.invokeMethod(myController, "downscaleALL");
assertTrue(res);
}
当我调试它时它起作用了。但是当我 运行 测试正常时,它没有给出以下异常:
0 matchers expected, 1 recorded:
-> at com.mypackage.controller.MyController.downscaleALL(MyControllerTest.java:265)
This exception may occur if matchers are combined with raw values:
//incorrect:
someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
//correct:
someMethod(anyObject(), eq("String by matcher"));
For more info see javadoc for Matchers class.
添加 downScaleAll 方法
private Boolean downscaleALL() {
try {
String downScaleResources = someservice.downScaleResources();
if (downScaleResources.equals("DONE")) {
Thread.sleep(20000); // 20s
log.info("DOWNSCALING THE RESOURCES NOW");
return true;
}
return false;
} catch (Exception e) {
log.error("Error while downscaling the resources");
log.error(e.toString());
return false;
}
}
你应该只 mock types you own 所以,如果你想模拟对 Thread.sleep()
的调用,你应该将其提取到你拥有的类型中(例如 ThreadSleeper
),因此可以模拟.更好的是,如果可以的话,重写以避免睡眠。睡眠通常是一种代码气味(偷工减料)。
我同意@Elevate 提到的,你不应该模拟你不拥有的类型。但是如果你还要做,你可以这样做
@RunWith(PowerMockRunner.class)
@PrepareForTest({<ClassWherewaitForUpscaleFunctionisLocated>.class, Thread.class})
public class Mytest {
@Test
public void testStaticVoid() throws Exception {
PowerMockito.mockStatic(Thread.class);
doNothing().when(Thread.class, "sleep", anyLong());
.........
}
}