java - 使用模拟对方法进行单元测试

标签 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));
}

最佳答案

事实上,它不能被有效地 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/

相关文章:

c# - 无法在单元测试中将 void 分配给隐式类型变量

android - RxJava 在 Android 中测试 Presenter 时遇到的问题

java - 屏幕上快速快速的模板匹配。还需要坐标。 java

java - Rest API 和 Restful Web 服务之间的区别

java - 使用连接运算符 (+) 或 String.format() 方法的字符串连接

javascript - AngularJS 使用 Mocha 测试工厂

python - assert_has_calls 不会 stub 方法调用

java - 如何用xpath解析html?

java - Mockito void doAnswer 正确用法和目的

android - Robolectric buildActivity() 与 Mockito spy ?