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

6 java junit unit-testing mocking mockito

考虑我嘲笑某些服务及其方法的场景.

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));
Run Code Online (Sandbox Code Playgroud)

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

Mur*_*nik 5

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

模拟的目的是消除外部依赖性,这样您就可以对代码进行单元测试,而不依赖于其他类的代码.例如,假设您有一个使用Employee您所描述的类的类:

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

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

// 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));
Run Code Online (Sandbox Code Playgroud)