如何使用Mockito JUNIT java.util.Function
我想在toEntity函数上使用Mockito执行junit测试如何使用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
@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)