我有一堂課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
?,如文檔中所述。
添加回答
舉報
0/150
提交
取消