我有一个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
成为应有的对象?我应该使用模拟/存根吗?
答案 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
方法调用的行为。