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

我有一堂课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 吗?


白衣非少年
浏览 185回答 1
1回答

幕布斯6054654

AWSCredentialsProvider#getCredentials它返回 null,因为未定义行为。从 Spock 的基于交互的测试文档中,当未在模拟对象方法上定义行为时,将返回其默认值,在您的情况下,默认Object值为null最初,模拟对象没有任何行为。允许调用它们的方法,但除了返回方法返回类型的默认值(false、0 或 null)外,没有任何效果。一个例外是 Object.equals、Object.hashCode 和 Object.toString 方法AWSCredentialsProvider#getCredentials为了克服这个问题,您可能需要定义方法调用的行为stubbing ,如文档中所述。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java