2014-09-30 37 views
2

我正在使用mockito模拟。我的mockito模拟如何调用带变更参数的原始方法?

我想控制方法foo(String a, Date b)

的调用来调用与foo(a, fixed_date)

原来的方法如何使用API​​的Mockito这样做?

MyObject myObject = mock(MyObject.class); 

     when(myObject.foo(anyString, any(Date.class)) 
       .thenCallRealMethod(); 

为什么这不起作用?

它永远不会将呼叫重定向

ImagesSorter imagesSorter = spy(new ImagesSorter()); 
     doReturn(imagesSorter.sortImages(images, user, fakeNowDate)).when(imagesSorter).sortImages(images,user); 
+0

有什么方法'thenCallRealMethod()'执行?哪个类实现了这个方法? – 2014-09-30 13:32:08

+0

'thenCallRealMethod()'实际上是mockito API的一部分 – Benjamin 2014-09-30 13:38:56

+0

为什么你想这样做?您的测试现在执行的代码与部署时不同。你是否这样做是因为你的测试场景是为特定的日期实例编写的? – SteveD 2014-09-30 13:51:25

回答

1

我有一个解决方案,但它是一个有点哈克,让我们假设的返回类型fooString

import static org.mockito.Mockito.when; 
import static org.mockito.Mockito.mock; 
import static org.mockito.Matchers.any; 
import static org.mockito.Matchers.anyString; 

... 

final Date fixedDate = ...; 

MyClass myObject = mock(MyClass.class); 

when(myObject.foo(anyString(), any(Date.class))).thenAnswer(new Answer<String>() { 
     public String answer(InvocationOnMock invocation) throws Throwable { 
      // Switch the 2nd argument 
      invocation.getArguments()[1] = fixedDate; 
      // Then call the real method 
      return (String) invocation.callRealMethod(); 
     } 
    }); 

随着MyClass是例如:

public class MyClass { 

    public String foo(String s, Date d) { 
     return s + d; 
    } 
} 

编辑:

在你与ImageSorter最后一个例子,我想你不需要的Mockito,简单的装饰会做的伎俩:

public interface ImageSorter { 
    void sortImages(Images images, User user); 

    void sortImages(Images images, User user, Date date); 
} 

public class ImageSorterDecorator implements ImageSorter { 

    final ImageSorter delegate; 
    final Date fixedDate; 

    public ImageSorterDecorator (ImageSorter delegate, Date fixedDate){ 
     this.delegate = delegate; 
     this.fixedDate = fixedDate; 
    } 

    public void sortImages(Images images, User user){ 
     delegate.sortImages(images, user, fixedDate); 
    } 

    public void sortImages(Images images, User user, Date date){ 
     delegate.sortImages(images, user, fixedDate); 
    } 
} 
+0

它如何处理mockito语法? – 2014-10-01 07:50:16

+0

你是什么意思?它使用mockito API,我使用的版本是1.9.5 – Benjamin 2014-10-01 07:58:06

+0

对不起,在any(Date.class)'之后缺少右括号。我修好了它 – Benjamin 2014-10-01 08:09:49

相关问题