为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

白衣非少年 2023-05-24 17:42:18
我有一堂课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从中获取getDynamoDBCredentials()来自 Mock 对象的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。当我调试它时,类型roleCredentials是“Mock for type AWSCredentialsProvider”。getCredentials()在调用它之后,它得到了null。这是因为我错误地使用了 Groovy 吗?我怎样才能使它v1Credentials成为应该的对象?我应该使用 Mock/Stub 吗?
查看完整描述

1 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

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

从 Spock 的基于交互的测试文档中,当未在模拟对象方法上定义行为时,将返回其默认值,在您的情况下,默认Object值为null

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

AWSCredentialsProvider#getCredentials为了克服这个问题,您可能需要定义方法调用的行为stubbing ,如文档中所述。


查看完整回答
反对 回复 2023-05-24
  • 1 回答
  • 0 关注
  • 184 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信