以方法参考为参数的单元测试方法

时间:2018-11-07 19:54:55

标签: java unit-testing mockito

我有一个以对象为参数的方法和对该对象的方法引用,以从该对象收集集合中的整数。该代码可以正常工作,但是我无法在when()方法上使用mockito进行单元测试。

public class UserCredentials {

  private Integer accountId;

  private Integer customerNameId;
}

public class UserCredentialsUtil {

  public List<Integer> userCredentialsGetter(
      final List<UserCredentials> userCredentials,
      final Function<UserCredentials, Integer> func) {
    return userCredentials.stream().map(func).collect(Collectors.toList());
  }
}

我的单元测试基本上向我返回了一个空列表。

  @Mock
  private UserCredentialsUtil userCredentialsUtil;

final List<Integer> accountIds = Arrays.asList(1, 2, 3);

        when(
        this.userCredentialsUtil.userCredentialsGetter(
            userCredentials,
         UserCredentials::getAccountId)).thenReturn(accountIds);

我知道这对我的设置不是问题,因为如果我将UserCredentialsGetter更改为

  public List<Integer> userCredentialsGetter(
      final List<UserCredentials> userCredentials) {
    return userCredentials.stream().map(UserCredentials::getAccountId).collect(Collectors.toList());
  }

测试方法。

        when(
        this.userCredentialsUtil.userCredentialsGetter(
            userCredentials)).thenReturn(accountIds);

这很好。我猜我需要传递其他内容,然后将方法引用作为参数进行第一次测试,但是我很不幸地发现有人参与这种情况,即使这种情况看起来很普遍。

1 个答案:

答案 0 :(得分:2)

使用嘲笑,您需要确保传递到when语句中的方法与实际方法传递的方法相同。根据您的示例,您正在使用UserCredentials::getAccountIdUserCredentials::accountId(可能是错字)。

您可能要考虑使用其他参数匹配器:

import static org.mockito.ArgumentMatchers.*;

when(userCredentialsUtil.userCredentialsGetter(eq(userCredentials), any()).thenReturn(accountIds);