Powermock,UUID.getRandom的mockStatic在测试类中工作,但在测试的类中没有

问题描述 投票:0回答:1

奇怪的情况:使用Powermock模拟出UUID.getRandom()。这适用于JUnit测试类,但是当被测试的类(过滤器,如果重要)调用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());
    }
}

正在测试的简单类

public class MyFilter implements Filter {

    public UUID getUUID() {

        return UUID.randomUUID();
    }
}

非常简单的东西,之前做过这样的嘲讽,只是无法弄清楚为什么这个案例不起作用。

使用Powermock 1.5版。

uuid powermock mockstatic
1个回答
1
投票

我相信UUID属于"system classes" category,所以你需要准备测试类调用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());
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.