使用Mockito模拟日期对象

时间:2015-12-29 04:15:54

标签: java unit-testing mocking mockito junit3

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

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

无效。有人可以帮我这个吗?

2 个答案:

答案 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)

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

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

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

  4. 如果您希望返回虚拟值,则通过thenReturn()子句返回该值。您可以返回null值或非空值。显然,如果计划返回非空值,则必须创建对象(在您的情况下,它可能是具体的Date对象)

  5. 所以你的代码看起来应该是,

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

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

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

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