使用@Mocked多次模拟同一个类时的JMockit行为

时间:2012-03-23 12:17:58

标签: java junit mocking jmockit

在模拟一次类和在测试中两次模拟一个类时,我得到不同的输出。我知道@Mocked模拟了类的所有实例,但不确定多次模拟会影响新创建的对象的输出。 预期会出现这种情况吗?

测试1.打印 10

 @Test
 public void jmockitTest1(@Mocked final Date d1)
 {
       new NonStrictExpectations()
       {{
            d1.getTime(); returns(10L);
       }};

       System.out.println( d1.getTime() );  // prints 10
       System.out.println( new Date().getTime() ); // prints 10 !
 }

使用第二个模拟日期测试2。打印 0

 @Test
 public void jmockitTest2(@Mocked final Date d1, @Mocked final Date d2)
 {
       new NonStrictExpectations()
       {{
            d1.getTime(); returns(10L);
       }};

       System.out.println( d1.getTime() );  // prints 10
       System.out.println( new Date().getTime() ); // prints 0 !
 }

1 个答案:

答案 0 :(得分:1)

第二次测试,Date模拟两次,默认情况下获得“实例间”匹配。所以,好像期望被记录为onInstance(d1).getTime();

模拟行为的这种差异仅在方便时自动激活。在同一测试中声明相同类型的多个模拟字段/参数的唯一原因是调用不同的模拟实例会产生不同的结果;自动“实例”匹配避免了在每个实例上使用onInstance(mock)的需要。