如何使用Mockito JUNIT java.util.Function

如何使用Mockito JUNIT java.util.Function,java,junit,mockito,Java,Junit,Mockito,我想在toEntity函数上使用Mockito执行junit测试 @Component public class MyEntityTransform { public Function<MyDTO , MyEntity> toEntity = new Function<MyDTO , MyEntity >() { @Override public MyEntity apply(MyDTO re

我想在toEntity函数上使用Mockito执行junit测试

    @Component
    public class MyEntityTransform {
        public Function<MyDTO , MyEntity> toEntity = new Function<MyDTO , MyEntity >() {
            @Override
            public MyEntity apply(MyDTO record) {
                return new MyEntity();
            }
        };  
    }
当我运行JUNIT测试时,Mockito会告诉我错误:

java.lang.NullPointerException org.mockito.exceptions.misusing.invalidUseofMatchers异常: 此处检测到放错位置的参数匹配器:

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

不能在验证或存根之外使用参数匹配器。 正确使用参数匹配器的示例: when(mock.get(anyInt()).thenReturn(null); doThrow(newruntimeexception()).when(mock).someVoidMethod(anyObject()); 验证(mock).someMethod(包含(“foo”))

此外,此错误可能会出现,因为您将参数匹配器用于 无法模拟的方法。不能使用以下方法 存根/验证:final/private/equals()/hashCode()。模拟方法 不支持在非公共父类上声明


您有什么建议吗?

您使用的是公共字段,这不是一个好主意。但无论如何,您想要模拟的是函数,而不是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)

这里绝对没有理由使用嘲弄。模拟是用来测试A的,它使用B,向A提供一个假的B。模拟你正在测试的东西没有意义。我不明白。如果你想测试
函数
为什么要涉及
Mockito
?很抱歉,我想在另一个测试中使用函数toEntity作为模拟。发布一个完整的最小示例来重现这个问题。你模拟这个类的困难是因为你违反了OOP信息隐藏中最重要的原则。方法
apply()
(正如您在这里发布的那样)只是
toEntity
属性的一个getter。要么类
MyEntityTransform
是一个没有任何逻辑的DTO,这样就可以了,但是不应该对它进行模拟。或者
MyEntityTransform
contais是一些业务逻辑,那么其他人不应该(直接)访问它的属性。谢谢!你帮助我认识到我的错误。
collection.stream().map(myEntityTranform::toEntity)