为什么 mockStatic 的行为不如预期?
Why mockStatic doesn't behave as expected?
mockito-核心版本:1.10.19
powermock 版本:1.6.6
我尝试模拟一些静态方法,但输出让我感到困惑。
这是我的代码:
class ClassWithStatics {
public static int getNextInt() {
return getInt() + 1;
}
public static int getInt() {
return 1;
}
public static long getTime() {
return System.currentTimeMillis();
}
}
@RunWith(PowerMockRunner.class)
@PrepareForTest({ClassWithStatics.class, System.class})
public class StubJustOneStatic {
@Test
public void test() {
PowerMockito.mockStatic(ClassWithStatics.class);
Mockito.when(ClassWithStatics.getInt()).thenReturn(0);
PowerMockito.mockStatic(System.class);
Mockito.when(System.currentTimeMillis()).thenReturn(12345L);
System.out.println("Next Int: " + ClassWithStatics.getNextInt());
System.out.println("Int: " + ClassWithStatics.getInt());
System.out.println("Time:" + ClassWithStatics.getTime());
}
}
输出为
Next Int: 0
Int: 0
Time:0
但是当我使用下面的代码时,ClassWithStatics.getTime()
打印出我想要的内容。
@RunWith(PowerMockRunner.class)
@PrepareForTest({ClassWithStatics.class, System.class})
public class StubJustOneStatic {
@Test
public void test() {
// PowerMockito.mockStatic(ClassWithStatics.class);
// Mockito.when(ClassWithStatics.getInt()).thenReturn(0);
PowerMockito.mockStatic(System.class);
Mockito.when(System.currentTimeMillis()).thenReturn(12345L);
// System.out.println("Next Int: " + ClassWithStatics.getNextInt());
// System.out.println("Int: " + ClassWithStatics.getInt());
System.out.println("Time:" + ClassWithStatics.getTime());
}
}
非常感谢。
你正在模拟静态 class 这意味着如果你没有明确定义 when()..then() 行为,Mockito 将 return 默认值(0 在情况下长)。
您将不得不使用间谍来仅模拟某些方法并让其他方法 运行 实现:
PowerMockito.spy(ClassWithStatics.class);
Mockito.when(ClassWithStatics.getInt()).thenReturn(5);
现在调用时:
PowerMockito.mockStatic(System.class);
Mockito.when(System.currentTimeMillis()).thenReturn(12345L);
System.out.println("Time:" + ClassWithStatics.getTime());
调用 ClassWithStatics.getInt()
时应该得到 5
,调用 ClassWithStatics.getTime()
.
时应该得到 12345L
mockito-核心版本:1.10.19
powermock 版本:1.6.6
我尝试模拟一些静态方法,但输出让我感到困惑。 这是我的代码:
class ClassWithStatics {
public static int getNextInt() {
return getInt() + 1;
}
public static int getInt() {
return 1;
}
public static long getTime() {
return System.currentTimeMillis();
}
}
@RunWith(PowerMockRunner.class)
@PrepareForTest({ClassWithStatics.class, System.class})
public class StubJustOneStatic {
@Test
public void test() {
PowerMockito.mockStatic(ClassWithStatics.class);
Mockito.when(ClassWithStatics.getInt()).thenReturn(0);
PowerMockito.mockStatic(System.class);
Mockito.when(System.currentTimeMillis()).thenReturn(12345L);
System.out.println("Next Int: " + ClassWithStatics.getNextInt());
System.out.println("Int: " + ClassWithStatics.getInt());
System.out.println("Time:" + ClassWithStatics.getTime());
}
}
输出为
Next Int: 0
Int: 0
Time:0
但是当我使用下面的代码时,ClassWithStatics.getTime()
打印出我想要的内容。
@RunWith(PowerMockRunner.class)
@PrepareForTest({ClassWithStatics.class, System.class})
public class StubJustOneStatic {
@Test
public void test() {
// PowerMockito.mockStatic(ClassWithStatics.class);
// Mockito.when(ClassWithStatics.getInt()).thenReturn(0);
PowerMockito.mockStatic(System.class);
Mockito.when(System.currentTimeMillis()).thenReturn(12345L);
// System.out.println("Next Int: " + ClassWithStatics.getNextInt());
// System.out.println("Int: " + ClassWithStatics.getInt());
System.out.println("Time:" + ClassWithStatics.getTime());
}
}
非常感谢。
你正在模拟静态 class 这意味着如果你没有明确定义 when()..then() 行为,Mockito 将 return 默认值(0 在情况下长)。
您将不得不使用间谍来仅模拟某些方法并让其他方法 运行 实现:
PowerMockito.spy(ClassWithStatics.class);
Mockito.when(ClassWithStatics.getInt()).thenReturn(5);
现在调用时:
PowerMockito.mockStatic(System.class);
Mockito.when(System.currentTimeMillis()).thenReturn(12345L);
System.out.println("Time:" + ClassWithStatics.getTime());
调用 ClassWithStatics.getInt()
时应该得到 5
,调用 ClassWithStatics.getTime()
.
12345L