MyService
类返回java.util.Date
对象的方法和MyManager
类正在调用MyService
类的方法。我正在编写MyManager
类的测试用例
当我嘲笑
Mockito.when(manager.getDate())).thenReturn((Date)Mockito.any())
无效。有人可以帮我这个吗?
答案 0 :(得分:3)
我认为您没有正确使用语法。 any
惯用法用于在调用方法时匹配参数,而不是用于指定被模拟的被调用的返回值。有关这些工作原理的详细信息,请参阅Matchers。
尝试提供实际日期作为返回值。
我从您的代码行中收集到您可能错误地使用Mockito。如果您使用模拟的Manager
测试Service
,那么您的代码应该类似于:
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
类,通常不会嘲笑Manager
对象(如代码所暗示的那样)。
答案 1 :(得分:1)
any
是一个Mockito匹配器,通常用于匹配被调用的函数参数,而不用于返回值。在大多数情况下,返回值是具体对象,类型是已知的,因此在any()
中使用thenReturn()
没有意义。
Mockito模拟可以应用于仅模拟对象的方法,因此如果您正在测试MyManager
类,该类依赖于MyService
类,并且某些方法是MyService
如果要模拟,首先需要为“MyService”类创建一个模拟对象,然后使用when
子句来模拟该方法。 MyManager
不会被嘲笑。
像any()
这样的匹配器在#2点出现,以匹配函数参数类型。在您的情况下,它是一个无参数函数,因此不需要匹配器。
如果您希望返回虚拟值,则通过thenReturn()
子句返回该值。您可以返回null
值或非空值。显然,如果计划返回非空值,则必须创建对象(在您的情况下,它可能是具体的Date
对象)
所以你的代码看起来应该是,
Mockito.when(service.getDate())).thenReturn(date);
或Mockito.when(service.getDate())).thenReturn(null);
其中service
是MyService
类型的模拟对象,date
是预先创建的Date
类型对象。
我们模拟依赖关系,而不是受测试的主体。