模拟对象的getter()为什么返回null?

时间:2019-08-10 03:13:26

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

我有一个ResolverChainContext班:

public class ResolverChainContext {
  private AWSCredentialsProvider assumeRoleCredentials;
}

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

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

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

接下来,在测试用例中,我调用方法getDynamoDBCredentialsV2(),该方法要从v1Credentials步骤中的Mock对象来自getDynamoDBCredentials()的{​​{1}}中得到: / p>

setup()

问题是我将以 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; } 获得null

当我调试它时,v1Credentials的类型为“模拟AWSCredentialsProvider类型”。在调用roleCredentials之后,它将得到getCredentials()

这是因为我错误地使用了Groovy吗?如何使null成为应有的对象?我应该使用模拟/存根吗?

1 个答案:

答案 0 :(得分:4)

由于未定义AWSCredentialsProvider#getCredentials的行为,因此返回null。

从Spock的interaction based testing文档中,如果未在模拟对象方法上定义行为,则将返回其默认值,在您的情况下,Object的默认值为{{1} }

  

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

要解决此问题,您可能需要使用null as explained in the doc来定义AWSCredentialsProvider#getCredentials方法调用的行为。