如何使用Mockito JUNIT java.util.Function

时间:2016-11-18 20:33:54

标签: java junit mockito

我想在 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:   在这里检测到错位的参数匹配器:

     

- &GT;在com.example.MyTest.setUp(MyTest.java:38)

     

您不能在验证或存根之外使用参数匹配器。   正确使用参数匹配器的示例:       当(mock.get(anyInt()))thenReturn(空)。       doThrow(new RuntimeException())。when(mock).someVoidMethod(anyObject());       验证(模拟).someMethod(含有(&#34;富&#34))

     

此外,此错误可能会显示,因为您使用参数匹配器   无法模拟的方法。以下方法不能   stubbed / verified:final / private / equals()/ hashCode()。嘲弄方法   不支持在非公共父类上声明。

你有什么建议吗?

1 个答案:

答案 0 :(得分:5)

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