2015-12-29 107 views
0

MyService类的方法返回java.util.Date对象和MyManager类正在调用MyService类的方法。我正在编写MyManager类的测试用例。
当我嘲笑使用Mockito模拟日期对象

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

不工作。有人可以帮我解决这个问题吗?

+0

我正在使用java4和junit3 – user1920

+0

你是什么意思不工作?编译错误,测试用例失败? – sidgate

回答

3

我不认为你正在使用正确的语法。 any成语用于在调用方法时匹配参数,而不用于指定被调用的模拟的返回值。有关这些工作方式的详细信息,请参见Matchers

尝试提供一个真实的日期作为您的返回值。

我从您的代码行收集可能会错误地使用Mockito。

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对象(您的代码所暗示的),如果你的测试:如果您使用的是嘲笑Service那么你的代码可能看起来像测试ManagerManager类。

+0

谢谢@sprinter – user1920

1
  1. any是匹配的Mockito,通常用来匹配调用的函数的参数,而不是返回值。在大多数情况下,返回值是具体的对象和类型是已知的,因此在thenReturn()中使用any()没有任何意义。

  2. 的Mockito嘲讽可以这样,如果你正在测试MyManager类对MyService类的依赖,如果一些的MyService方法旨在被嘲笑,你首先需要创建一个嘲笑适用于只是嘲笑对象的方法对象为'MyService'类,然后使用when子句来模拟该方法。 MyManager不会被嘲笑。

  3. any()这样的匹配器在点#2处出现,以匹配函数参数类型。在你的情况下,它的一个没有参数函数,所以没有匹配器需要。

  4. 如果您希望返回虚拟值,则通过thenReturn()子句返回该值。您可以返回null值或非空值。很明显,你必须创建一个对象,如果打算回非 - 空值(在你的情况,这可能是一个具体的Date对象)

所以,你的代码应该是什么样子,

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

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

其中serviceMyService类型和date的嘲笑对象是预创建的Date类型对象。

我们模拟依赖关系,而不是测试中的主题。