2016-11-18 76 views
0

我想执行一个junit测试使用Mockito对toEntity函数。如何使用Mockito JUNIT一个java.util.Function

@Component 
    public class MyEntityTransform { 
     public Function<MyDTO , MyEntity> toEntity = new Function<MyDTO , MyEntity >() { 
      @Override 
      public MyEntity apply(MyDTO record) { 
       return new MyEntity(); 
      } 
     }; 
    } 

不幸的是,toEntityNULL当我嘲笑类,我不知道我怎样才能正确地进行测试。

@RunWith(MockitoJUnitRunner.class) 
public class MyTest { 

    @InjectMocks 
    private MyService _classUnderTest; 

    @Mock 
    private MyEntityTransform myEntityTransform 

    @Before 
    public void setUp() { 
     Mockito.when(this.myEntityTransform.toEntity.apply(Mockito.anyObject())).thenReturn(...); 
    } 
} 

当我运行JUnit测试,给的Mockito我的错误:

显示java.lang.NullPointerException org.mockito.exceptions.misusing.InvalidUseOfMatchersException:这里检测 错位的参数匹配:

- >在com.example.MyTest.setUp(MyTest.java:38)

无法使用验证或ST的外参数匹配器ubbing。 正确使用参数匹配器的示例: when(mock.get(anyInt()))。thenReturn(null); doThrow(new RuntimeException())。when(mock).someVoidMethod(anyObject()); 验证(模拟).someMethod(包含(“富”))

而且,这个错误可能会显示出来,因为你使用参数的匹配与 方法不能被嘲笑。以下方法不能为 存根/验证:final/private/equals()/ hashCode()。不支持在非公共父类上声明的模拟方法 。

你有什么建议吗?

+2

在这里绝对没有理由使用模拟。当测试使用B的A时,使用嘲讽来为A提供假B。嘲笑你正在测试的东西没有意义。 –

+0

我不明白。如果你想测试'Function'为什么涉及到'Mockito'? –

+0

对不起,我想在另一个测试中使用函数toEntity作为模拟。 –

回答

4

您正在使用公共字段,这不是一个好主意。但无论如何,你想要模拟的是函数,而不是MyEntityTransform的实例。所以你需要类似

@InjectMocks 
private MyService _classUnderTest; 

@Mock // or @Spy 
private MyEntityTransform myEntityTransform; 

@Before 
public void prepare() { 
    myEntityTransform.toEntity = mock(Function.class); 
} 

但坦率地说,我不会使用类型为Function的公共字段。相反,我会用一个公共方法:

public class MyEntityTransform { 
    public MyEntity toEntity(MyDTO record) { 
     return new MyEntity(); 
    } 
} 

然后你可以嘲笑MyEntityTransform并使其toEntity方法返回你想要什么。如果你需要通过一个函数来执行该方法,请使用方法参考:

collection.stream().map(myEntityTranform::toEntity) 
+0

谢谢!你帮我意识到我的错误。 –