使用 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
对象(正如您的代码所暗示的那样) ]
any
是一个 Mockito 匹配器,通常用于匹配调用的函数参数而不是 returning 值。在大多数情况下,return 值是具体对象并且类型是已知的,因此在 thenReturn()
中使用 any()
没有意义。
Mockito 模拟只能应用于模拟对象的方法,因此如果您正在测试 MyManager
class 依赖于 MyService
class 并且如果 MyService
的某些方法打算被模拟,您首先需要为 'MyService' class 创建一个模拟对象,然后使用 when
子句来模拟该方法. MyManager
不会被嘲笑。
像 any()
这样的匹配器在第 2 点出现,以匹配函数参数类型。在您的情况下,它是一个 无参数 函数,因此不需要匹配器。
如果您希望 return 一个虚拟值,那么 return 该值通过 thenReturn()
子句。您可以 return null
值或非空值。显然,如果计划 return 非空值(在您的情况下,它可能是一个具体的 Date
对象)
,您将不得不创建对象
所以你的代码应该是这样的,
Mockito.when(service.getDate())).thenReturn(date);
或Mockito.when(service.getDate())).thenReturn(null);
其中 service
是 MyService
类型的模拟对象,date
是预先创建的 Date
类型对象。
我们模拟依赖关系而不是被测对象。
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
对象(正如您的代码所暗示的那样) ]
any
是一个 Mockito 匹配器,通常用于匹配调用的函数参数而不是 returning 值。在大多数情况下,return 值是具体对象并且类型是已知的,因此在thenReturn()
中使用any()
没有意义。Mockito 模拟只能应用于模拟对象的方法,因此如果您正在测试
MyManager
class 依赖于MyService
class 并且如果MyService
的某些方法打算被模拟,您首先需要为 'MyService' class 创建一个模拟对象,然后使用when
子句来模拟该方法.MyManager
不会被嘲笑。像
any()
这样的匹配器在第 2 点出现,以匹配函数参数类型。在您的情况下,它是一个 无参数 函数,因此不需要匹配器。如果您希望 return 一个虚拟值,那么 return 该值通过
thenReturn()
子句。您可以 returnnull
值或非空值。显然,如果计划 return 非空值(在您的情况下,它可能是一个具体的Date
对象) ,您将不得不创建对象
所以你的代码应该是这样的,
Mockito.when(service.getDate())).thenReturn(date);
或Mockito.when(service.getDate())).thenReturn(null);
其中 service
是 MyService
类型的模拟对象,date
是预先创建的 Date
类型对象。
我们模拟依赖关系而不是被测对象。