Mockito Core和Mockito Inline之间的区别

2025/03/19

1. 概述

Mockito是用Java创建Mock对象的最流行的框架之一,它提供Mockito Core和Mockito Inline作为具有不同特性和用例的两个主要单元测试库。

要了解有关使用Mockito进行测试的更多信息,请查看我们全面的Mockito系列

2. Mockito Core

Mockito的基础库之一是Mockito Core,它提供了创建Mock、存根和间谍的基本功能。这个库足以满足大多数常见用例,但也有一些限制,特别是在处理最终类和静态方法时。

此处查看Mockito Core的Mock示例。

3. Mockito Inline

Mockito Inline是Mockito Core的扩展,包括用于Mock final类、final字段、静态方法和构造函数的附加功能。当你需要Mock或存根这些类型的方法或类时,此库非常有用。在最新版本的Mockito Core中,自Mockito Core 版本5.0.0以来,Mockito Inline成为默认的Mock生成器。

现在,让我们在代码上尝试一下。首先,我们需要在pom.xml依赖项中添加mockito-core

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>5.11.0</version>
    <scope>test</scope>
</dependency>

3.1 Mock Final类

让我们尝试Mock final类,我们需要创建一个名为FinalClass的新类:

public final class FinalClass {
    public String greet() {
        return "Hello, World!";
    }
}

让我们看一下Mock最终类的这些代码实现:

@Test
void testFinalClassMock() {
    FinalClass finalClass = mock(FinalClass.class);
    when(finalClass.greet()).thenReturn("Mocked Greeting");

    assertEquals("Mocked Greeting", finalClass.greet());
}

在上面的代码示例中,我们Mock了finalClass,然后我们对名为greet()的方法进行存根,以返回字符串值“Mocked Greeting”,而不是原始值“Hello, World!”

3.2 Mock final字段

让我们尝试Mock final字段,我们需要创建一个名为ClassWithFinalField的新类:

public class ClassWithFinalField {
    public final String finalField = "Original Value";

    public String getFinalField() {
        return finalField;
    }
}

让我们看一下Mock final字段的这些代码实现:

@Test
void testFinalFieldMock() {
    ClassWithFinalField instance = mock(ClassWithFinalField.class);
    when(instance.getFinalField()).thenReturn("Mocked Value");

    assertEquals("Mocked Value", instance.getFinalField());
}

在上面的代码示例中,我们Mock我们的实例,然后我们存根方法名getFinalField()以返回“Mocked Value”的字符串值而不是原始值“Original Value”

3.3 Mock静态方法

让我们尝试Mock静态方法,我们需要创建一个名为ClassWithStaticMethod的新类:

public class ClassWithStaticMethod {
    public static String staticMethod() {
        return "Original Static Value";
    }
}

我们来看看Mock静态方法的这些代码实现:

@Test
void testStaticMethodMock() {
    try (MockedStatic<ClassWithStaticMethod> mocked = mockStatic(ClassWithStaticMethod.class)) {
        mocked.when(ClassWithStaticMethod::staticMethod).thenReturn("Mocked Static Value");

        assertEquals("Mocked Static Value", ClassWithStaticMethod.staticMethod());
    }
}

在上面的代码示例中,我们Mock类名ClassWithStaticMethod,然后我们对方法名staticMethod()进行存根处理,以返回“Mocked Static Value”的字符串值,而不是原始值“Original Static Value”

3.4 Mock构造函数

让我们尝试Mock构造函数,我们需要创建一个名为ClassWithConstructor的新类:

public class ClassWithConstructor {
    private String name;

    public ClassWithConstructor(String name) {
        this.name = name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }
}

让我们看一下Mock构造函数的这些代码实现:

@Test
void testConstructorMock() {
    try (MockedConstruction<ClassWithConstructor> mocked = mockConstruction(ClassWithConstructor.class,
            (mock, context) -> when(mock.getName()).thenReturn("Mocked Name"))) {

        ClassWithConstructor myClass = new ClassWithConstructor("test");
        assertEquals("Mocked Name", myClass.getName());
    }
}

在上面的代码示例中,我们Mock类名ClassWithConstructor,然后Mock名为name的字段,使其具有字符串值“Mocked Name”,而不是构造函数中设置的值“test”

4. 总结

让我们总结一下迄今为止所学到的知识:

要Mock的元素 Mockito函数
Final类 mock(FinalClass.class)
Final字段 mock(ClassWithFinalField.class)
静态方法 mockStatic(ClassWithStaticMethod.class)
构造函数 mockConstruction(ClassWithConstructor.class)

5. 结论

在本教程中,我们比较了Mockito Core和Mockito Inline之间的差异。简而言之,Mockito Core可以Mock、存根和监视Java代码中的常见情况,但不能执行与final类、final方法、静态方法和构造函数相关的任何操作。另一方面,Mockito Inline可以执行Mockito Core无法执行的操作,即Mock和存根final类、final字段、静态方法和构造函数。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章