首页 文章

如何使用Mockito JUNIT java.util.Function

提问于
浏览
0

我想在 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();
            }
        };  
    }

不幸的是,当我模拟类时, toEntity 是NULL,我不知道如何正确测试它 .

@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:此处检测到错位的参数匹配器: - > at com.example.MyTest.setUp(MyTest.java:38)您不能在验证或存根之外使用参数匹配器 . 正确使用参数匹配器的示例:when(mock.get(anyInt())) . thenReturn(null); doThrow(new RuntimeException()) . when(mock).someVoidMethod(anyObject()); verify(mock).someMethod(contains(“foo”))此外,此错误可能会显示,因为您使用参数匹配器与无法模拟的方法 . 以下方法无法进行存根/验证:final / private / equals()/ hashCode() . 不支持在非公共父类上声明的模拟方法 .

你有什么建议吗?

1 回答

  • 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)
    

相关问题