我正在使用testng编写单元测试。问题是当我模拟system.currenttimemillis时,它返回的是实际值而不是模拟值。理想情况下,它应该返回0l,但它返回实际值。我应该怎么做才能继续?
class MyClass{
public void func1(){
System.out.println("Inside func1");
func2();
}
private void func2(){
int maxWaitTime = (int)TimeUnit.MINUTES.toMillis(10);
long endTime = System.currentTimeMillis() + maxWaitTime; // Mocking not happening
while(System.currentTimeMillis() <= endTime) {
System.out.println("Inside func2");
}
}
}
@PrepareForTest(System.class)
class MyClassTest extends PowerMockTestCase{
private MyClass myClass;
@BeforeMethod
public void setup() {
MockitoAnnotations.initMocks(this);
myclass = new MyClass();
}
@Test
public void func1Test(){
PowerMockito.mockStatic(System.class)
PowerMockito.when(System.currentTimeMillis()).thenReturn(0L);
myclass.func1();
}
}
3条答案
按热度按时间rqcrx0a61#
创建一个包构造函数,您可以在
java.time.Clock
```class MyClass{
private Clock clock;
public MyClass() {
this.clock = Clock.systemUTC();
}
// for tests
MyClass(Clock c) {
this.clock = c;
}
r7s23pms2#
您需要添加注解
@RunWith(PowerMockRunner.class)
去上课MyClassTest
.尽管如此,我还是建议重构代码以使用
java.time.Clock
,而不是嘲笑。xt0899hw3#
而不是使用
PowerMock
,您可以使用Mockito
它也有一个mockStatic
方法请参阅以下答案,以获取有关
LocalDate
你的情况是这样的注意的用法
Mockito.CALLS_REAL_METHODS
这将保证System
如果用另一个方法调用,它将执行类的实际方法