【问题标题】:Why does the getter() of mock object return null?为什么mock对象的getter()返回null?
【发布时间】:2019-08-10 03:13:26
【问题描述】:

我有一堂课ResolverChainContext:

public class ResolverChainContext {
  private AWSCredentialsProvider assumeRoleCredentials;
}

在单元测试(Groovy 和 Spock)的 setup() 中,我用 Mock 填充上述字段:

def setup() {
  def ctx = ResolverChainContext.builder().build()

  ctx.setAssumeRoleCredentials(Mock(AWSCredentialsProvider.class))
}

接下来在我的测试用例中,我调用一个方法getDynamoDBCredentialsV2(),我想从getDynamoDBCredentials() 中获取v1Credentials,它来自setup() 步骤中的Mock 对象:


public interface AWSCredentialsProvider {
    AWSCredentials getCredentials();

    void refresh();
}

protected AWSCredentialsProvider getDynamoDBCredentials() {
    final AWSCredentialsProvider fasCredentials = resolverChainContext.getFasCredentials();
    final AWSCredentialsProvider roleCredentials = resolverChainContext.getAssumeRoleCredentials();
    if (null == fasCredentials || !invokerConfig.isUseCallerCredentials()) {
        return roleCredentials;
    } else {
        return fasCredentials;
    }
}

protected AwsCredentialsProvider getDynamoDBCredentialsV2() {

    AWSCredentials v1Credentials = getDynamoDBCredentials().getCredentials();

    blahblahblah;
}

问题是我会为v1Credentials 得到null

当我调试它时,roleCredentials 的类型是“Mock for type AWSCredentialsProvider”。在调用getCredentials() 之后,它会得到null

这是因为我以错误的方式使用 Groovy 吗?我怎样才能使v1Credentials 成为它应该是的对象?我应该使用 Mock/Stub 吗?

【问题讨论】:

    标签: java unit-testing groovy aws-sdk spock


    【解决方案1】:

    它返回 null,因为未定义 AWSCredentialsProvider#getCredentials 的行为。

    从 Spock 的 interaction based testing 的文档中,当模拟对象方法上未定义行为时,将返回其默认值,在您的情况下,Object 的默认值为 null

    最初,模拟对象没有任何行为。允许对它们调用方法,但除了返回方法返回类型的默认值(false、0 或 null)之外没有其他效果。 Object.equals、Object.hashCode 和 Object.toString 方法是个例外

    要克服这个问题,您可能需要使用 stubbing as explained in the doc 定义 AWSCredentialsProvider#getCredentials 方法调用的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-12
      • 1970-01-01
      • 1970-01-01
      • 2019-01-19
      • 2020-09-13
      • 2021-09-11
      • 2011-09-27
      • 1970-01-01
      相关资源
      最近更新 更多