单元测试一个带有模拟的方法

时间:2016-06-03 14:36:51

标签: java unit-testing mockito

我想对这种方法进行单元测试。我知道我需要模拟mxbean,但我不知道该怎么做。有人可以告诉我如何对这种方法进行单元测试吗?

@Override
public int compare(Long threadId1, Long threadId2) {
    ThreadMXBean mxbean = ManagementFactory.getThreadMXBean();
    return Long.compare(mxbean.getThreadCpuTime(threadId2), mxbean.getThreadCpuTime(threadId1));
}

1 个答案:

答案 0 :(得分:1)

实际上,它无法有效地被嘲笑。您需要将局部变量移动到字段。

ThreadMXBean mxbean = ManagementFactory.getThreadMXBean();

@Override
public int compare(Long threadId1, Long threadId2) {
    return Long.compare(mxbean.getThreadCpuTime(threadId2), mxbean.getThreadCpuTime(threadId1));
}

现在你可以在测试中将字段重新分配给模拟(我将使用Mockito,但也存在其他框架):

@Test
public void yourTestMethod(){
    YourClass yourClass = new YourClass();
    ThreadMXBean mock = Mockito.mock(ThreadMXBean.class)
    Mockito.when(mxbean.getThreadCpuTime(1L)).thenReturn(1);
    Mockito.when(mxbean.getThreadCpuTime(2L)).thenReturn(2);
    yourClass.mxbean = mock;
    assertThat(yourClass.compare(1L, 2L), is(-1));
}

但是使用Mockito JUnit Runner并让Mockito自动创建模拟更好:

@RunWith(MockitoJUnitRunner.class)
public class YourTest{

    @InjectMocks YourClass yourClass = new YourClass();
    @Mock ThreadMXBean mock;

    @Test
    public void yourTestMethodDoesntNeedToCreateMocksAnymore(){
        Mockito.when(mxbean.getThreadCpuTime(1L)).thenReturn(1);
        Mockito.when(mxbean.getThreadCpuTime(2L)).thenReturn(2);
        assertThat(yourClass.compare(1L, 2L), is(-1));
    }


}

最后:如果用静态导入替换所有Mockito。*调用,例如

,测试会更具可读性
MyFoo foo = mock(MyFoo.class);
when(foo.bar()).thenReturn(baz);