我想对这个方法进行单元测试。我知道我需要模拟 mxbean,但我不知道该怎么做。有人可以告诉我如何对这个方法进行单元测试吗?
@Override
public int compare(Long threadId1, Long threadId2) {
ThreadMXBean mxbean = ManagementFactory.getThreadMXBean();
return Long.compare(mxbean.getThreadCpuTime(threadId2), mxbean.getThreadCpuTime(threadId1));
}
最佳答案
事实上,它不能被有效地 mock 。您需要将局部变量移动到字段。
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);
关于java - 使用模拟对方法进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37617200/