📜  java mockito 任意字符串导入 - Java (1)

📅  最后修改于: 2023-12-03 15:15:57.198000             🧑  作者: Mango

Java Mocktio 任意字符串导入

Mockito 是一个流行的 Java 测试框架,可以让开发者创建测试时所需的 mock 对象。Mockito 可以用于验证代码中的行为是否正确地与其他对象进行交互。

导入 Mockito

你可以在项目的 pom.xml 文件中添加以下依赖来导入 Mockito:

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>3.8.0</version>
    <scope>test</scope>
</dependency>
Mockito 的基本用法

假设你要测试一个需要依赖其他对象的类 MyClass,你可以使用 Mockito 来创建这些依赖:

public class MyClass {
    private Dependency dependency;

    public MyClass(Dependency dependency) {
        this.dependency = dependency;
    }

    public void doSomething() {
        dependency.doSomethingElse();
    }
}

public interface Dependency {
    void doSomethingElse();
}

然后,你可以使用以下代码来测试 MyClass 类的行为是否正确:

import org.junit.Test;
import org.mockito.Mockito;

public class MyClassTest {
    @Test
    public void testDoSomething() {
        Dependency dependency = Mockito.mock(Dependency.class);
        MyClass myClass = new MyClass(dependency);

        myClass.doSomething();

        Mockito.verify(dependency).doSomethingElse();
    }
}

在上述代码中,我们通过 Mockito.mock(Dependency.class) 创建了一个名为 dependency 的 mock 对象。然后,我们使用这个 mock 对象来创建一个 MyClass 实例并调用其 doSomething() 方法。最后,我们使用 Mockito.verify(dependency) 来验证 dependency 对象的 doSomethingElse() 方法是否被调用过。

自定义返回值

你可以使用 Mockito.when() 方法自定义 mock 对象的返回值。

import org.junit.Test;
import org.mockito.Mockito;

public class MyClassTest {
    @Test
    public void testDoSomething() {
        Dependency dependency = Mockito.mock(Dependency.class);
        MyClass myClass = new MyClass(dependency);

        Mockito.when(dependency.doSomethingElse()).thenReturn("Hello!");

        myClass.doSomething();

        Mockito.verify(dependency).doSomethingElse();
    }
}

在上述代码中,我们使用 Mockito.when(dependency.doSomethingElse()).thenReturn("Hello!") 方法来告诉 Mockito,在调用 dependency.doSomethingElse() 方法时应该返回字符串 "Hello!"。

异常处理

你可以使用 Mockito.doThrow() 方法来模拟抛出异常。

import org.junit.Test;
import org.mockito.Mockito;

public class MyClassTest {
    @Test(expected = MyException.class)
    public void testDoSomething() {
        Dependency dependency = Mockito.mock(Dependency.class);
        MyClass myClass = new MyClass(dependency);

        Mockito.doThrow(new MyException()).when(dependency).doSomethingElse();

        myClass.doSomething();
    }
}

在上述代码中,我们使用 Mockito.doThrow(new MyException()).when(dependency).doSomethingElse() 方法来告诉 Mockito,在调用 dependency.doSomethingElse() 方法时应该抛出一个 MyException 异常。

数据驱动测试

你可以使用 @RunWith(Parameterized.class) 注解和 @Parameters 方法来实现数据驱动测试。

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.mockito.Mockito;

import java.util.Arrays;
import java.util.Collection;

@RunWith(Parameterized.class)
public class MyClassTest {
    private final String input;
    private final String output;

    public MyClassTest(String input, String output) {
        this.input = input;
        this.output = output;
    }

    @Parameters
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][]{
                {"input1", "output1"},
                {"input2", "output2"},
                {"input3", "output3"}
        });
    }

    @Test
    public void testDoSomething() {
        Dependency dependency = Mockito.mock(Dependency.class);
        MyClass myClass = new MyClass(dependency);

        Mockito.when(dependency.doSomethingElse(input)).thenReturn(output);

        String result = myClass.doSomething(input);

        Assert.assertEquals(output, result);
    }
}

在上述代码中,我们在 MyClassTest 类上使用了 @RunWith(Parameterized.class) 注解。然后,我们在类中定义了若干个 @Parameters 方法,这些方法会返回一个包含输入和输出参数的二维数组。最后,我们在测试方法中使用 Mockito.when(dependency.doSomethingElse(input)).thenReturn(output) 方法来告诉 Mockito,在调用 dependency.doSomethingElse(input) 方法时应该返回指定的输出值。

参考文献