使用 Mockito 模拟日期对象

Mock Date object using Mockito

MyService class returns java.util.Date 对象的方法和 MyManager class 正在调用 MyService 的方法class。我正在为 MyManager class.
编写测试用例 当我嘲笑

Mockito.when(manager.getDate())).thenReturn((Date)Mockito.any())

无效。有人可以帮我解决这个问题吗?

我认为您没有正确使用语法。 any 习语用于在调用方法时匹配参数,而不是用于指定模拟调用的 return 值。有关这些工作原理的详细信息,请参阅 Matchers

尝试提供真实日期作为您的 return 值。

我从你的代码行得知你可能错误地使用了 Mockito。如果您正在使用模拟的 Service 测试 Manager,那么您的代码应该类似于:

Date testDate = new Date("01/01/1970");
Service mockedService = mock(Service.class);
when(service.getDate()).thenReturn(testDate);
testManager.setService(service);
assertEquals(testDate, testManager.getServicesDate());

换句话说,如果您正在测试 Manager class.[=17=,您通常不会模拟 Manager 对象(正如您的代码所暗示的那样) ]

  1. any 是一个 Mockito 匹配器,通常用于匹配调用的函数参数而不是 returning 值。在大多数情况下,return 值是具体对象并且类型是已知的,因此在 thenReturn() 中使用 any() 没有意义。

  2. Mockito 模拟只能应用于模拟对象的方法,因此如果您正在测试 MyManager class 依赖于 MyService class 并且如果 MyService 的某些方法打算被模拟,您首先需要为 'MyService' class 创建一个模拟对象,然后使用 when 子句来模拟该方法. MyManager不会被嘲笑。

  3. any() 这样的匹配器在第 2 点出现,以匹配函数参数类型。在您的情况下,它是一个 无参数 函数,因此不需要匹配器。

  4. 如果您希望 return 一个虚拟值,那么 return 该值通过 thenReturn() 子句。您可以 return null 值或非空值。显然,如果计划 return 非空值(在您的情况下,它可能是一个具体的 Date 对象)

  5. ,您将不得不创建对象

所以你的代码应该是这样的,

Mockito.when(service.getDate())).thenReturn(date);

Mockito.when(service.getDate())).thenReturn(null);

其中 serviceMyService 类型的模拟对象,date 是预先创建的 Date 类型对象。

我们模拟依赖关系而不是被测对象。