UUID.getRandom 的 Powermock、mockStatic 在测试 class 中有效,但在 class 测试中无效
Powermock, mockStatic of UUID.getRandom works in test class but doesn't in the class tested
奇怪的情况:使用 Powermock 模拟 UUID.getRandom()。这在 JUnit 测试 class 中有效,但是当被测试的 class(过滤器,如果重要的话)调用 UUID.getRandom 时,会生成一个唯一的 UUID。
简单测试用例
@RunWith(PowerMockRunner.class)
@PrepareForTest({UUID.class})
public class MyTest {
private MyFilter filter;
@Before
public void setup() {
//The most convenient way to get a UUID, have also tried creating one manually
UUID uuid = UUID.randomUUID();
mockStatic(UUID.class);
PowerMockito.when(UUID.randomUUID()).thenReturn(uuid);
filter = new MyFilter();
}
@Test
public void testMyUUID() {
//This test works
assertEquals(UUID.randomUUID(), UUID.randomUUID());
}
@Test
public void testFilterUUID() {
//This test fails
assertEquals(UUID.randomUUID(), filter.getUUID());
}
}
简单class正在测试
public class MyFilter implements Filter {
public UUID getUUID() {
return UUID.randomUUID();
}
}
很简单的东西,以前做过这样的模拟,只是想不通为什么这个案例不起作用。
使用 Powermock 1.5 版。
我相信 UUID
属于 "system classes" category, so you need to prepare for test the class calling UUID.randomUUID()
(related github issue).,因此更改为 @PrepareForTest({MyFilter.class})
应该可以解决问题。以下内容在 JUnit 4.4 和 Powermock 1.5 以及 JUnit 4.12 和 Powermock 1.7.3 中按预期工作:
@RunWith(PowerMockRunner.class)
@PrepareForTest(MyFilter.class)
public class MyTest {
private MyFilter filter;
@Before
public void setup() {
//The most convenient way to get a UUID, have also tried creating one manually
UUID uuid = UUID.randomUUID();
mockStatic(UUID.class);
PowerMockito.when(UUID.randomUUID()).thenReturn(uuid);
filter = new MyFilter();
}
@Test
public void testMyUUID() {
//This test works
assertEquals(UUID.randomUUID(), UUID.randomUUID());
}
@Test
public void testFilterUUID() {
//This test fails
assertEquals(UUID.randomUUID(), filter.getUUID());
}
}
奇怪的情况:使用 Powermock 模拟 UUID.getRandom()。这在 JUnit 测试 class 中有效,但是当被测试的 class(过滤器,如果重要的话)调用 UUID.getRandom 时,会生成一个唯一的 UUID。
简单测试用例
@RunWith(PowerMockRunner.class)
@PrepareForTest({UUID.class})
public class MyTest {
private MyFilter filter;
@Before
public void setup() {
//The most convenient way to get a UUID, have also tried creating one manually
UUID uuid = UUID.randomUUID();
mockStatic(UUID.class);
PowerMockito.when(UUID.randomUUID()).thenReturn(uuid);
filter = new MyFilter();
}
@Test
public void testMyUUID() {
//This test works
assertEquals(UUID.randomUUID(), UUID.randomUUID());
}
@Test
public void testFilterUUID() {
//This test fails
assertEquals(UUID.randomUUID(), filter.getUUID());
}
}
简单class正在测试
public class MyFilter implements Filter {
public UUID getUUID() {
return UUID.randomUUID();
}
}
很简单的东西,以前做过这样的模拟,只是想不通为什么这个案例不起作用。
使用 Powermock 1.5 版。
我相信 UUID
属于 "system classes" category, so you need to prepare for test the class calling UUID.randomUUID()
(related github issue).,因此更改为 @PrepareForTest({MyFilter.class})
应该可以解决问题。以下内容在 JUnit 4.4 和 Powermock 1.5 以及 JUnit 4.12 和 Powermock 1.7.3 中按预期工作:
@RunWith(PowerMockRunner.class)
@PrepareForTest(MyFilter.class)
public class MyTest {
private MyFilter filter;
@Before
public void setup() {
//The most convenient way to get a UUID, have also tried creating one manually
UUID uuid = UUID.randomUUID();
mockStatic(UUID.class);
PowerMockito.when(UUID.randomUUID()).thenReturn(uuid);
filter = new MyFilter();
}
@Test
public void testMyUUID() {
//This test works
assertEquals(UUID.randomUUID(), UUID.randomUUID());
}
@Test
public void testFilterUUID() {
//This test fails
assertEquals(UUID.randomUUID(), filter.getUUID());
}
}