单元测试模拟返回的数据有什么意义?

2022-09-04 21:51:37

考虑一下我正在嘲笑某些服务及其方法的场景。

Employee emp = mock(Employee.class);
when(emp.getName(1)).thenReturn("Jim");
when(emp.getName(2)).thenReturn("Mark");

//assert
assertEquals("Jim", emp.getName(1));
assertEquals("Mark", emp.getName(2));

在上面的代码中,当调用时,mock 将返回 Jim,当调用 mock 时将返回 Mark。我的问题是我正在声明Mock的行为并检查它,拥有上述(或相同类型的)断言语句有什么意义?这些显然会通过。这就像检查有什么意义?这些测试何时会失败(除了更改返回类型和参数类型)?emp.getName(1)emp.getName(2)assertEquals3==(1+2)


答案 1

正如你所指出的,这些类型的测试是毫无意义的(除非你正在为Mockito本身编写单元测试,当然:-))。

模拟的要点是消除外部依赖关系,以便您可以对代码进行单元测试,而无需依赖其他类的代码。例如,假设您有一个使用您描述的类的类:Employee

public class EmployeeExaminer {
    public boolean isJim(Employee e, int i) {
        return "Jim".equals(e.getName(i));
    }
}

你想为它写一个单元测试。当然,你可以使用实际的类,但是你的测试将不再是单元测试 - 这将取决于 的实现。这就是模拟派上用场的地方 - 它允许您用可预测的行为替换,以便您可以编写稳定的单元测试:EmployeeEmployeeEmployee

// The object under test
EmployeeExaminer ee = new EmployeeExaminer();

// A mock Employee used for tests:
Employee emp = mock(Employee.class);
when(emp.getName(1)).thenReturn("Jim");
when(emp.getName(2)).thenReturn("Mark");

// Assert EmployeeExaminer's behavior:
assertTrue(ee.isJim(emp, 1));
assertFalse(ee.isJim(emp, 2));

答案 2

在你的情况下,你正在测试一个获取器,我不知道你为什么要测试它,也不知道为什么你需要嘲笑它。从您提供的代码来看,这是无用的。

在很多情况下,模拟是有意义的,当你编写单元测试时,你必须务实,你应该测试行为和模拟依赖关系。

在这里,您不是在测试行为,而是在模拟被测试的类。


推荐