gpt4 book ai didi

java - 如何根据服务调用模拟私有(private)成员变量

转载 作者:行者123 更新时间:2023-11-30 08:01:33 24 4
gpt4 key购买 nike

我想在 Java 中模拟 DataClient 类的对象。我不确定如何在这里模拟 s3 成员变量。我来自 ruby​​ 背景,我们有一个叫做 rspec-mock 的东西,我们不需要模拟实例变量。

public class DataClient {

private String userName, bucket, region, accessKey, secretKey;
private AmazonS3Client s3;

public OdwClient(String accessKey, String secretKey, String userName, String bucket, String region){
this.accessKey = accessKey;
this.accessKey = secretKey;
this.userName = userName;
this.bucket = bucket;
this.region = region;
this.s3 = new AmazonS3Client(new BasicAWSCredentials(accessKey, secretKey));
}

public boolean pushData(String fileName) {
s3.putObject(new PutObjectRequest("bucketName", fileName, new File("filePath")).
return true;
}
}

我现在在测试中尝试的是:

    @Before
public void setUp() throws Exception{
DataClient client = Mockito.mock(DataClient.class);
}

@Test
public void testPushData() {
// I don't know how to mock s3.putObject() method here
}

我的测试总是失败。

最佳答案

您遇到的问题是因为您没有使用依赖注入(inject)。模拟背后的整个想法是为外部依赖创建模拟对象。为此,您需要为您的对象提供这些外部依赖项。这可以作为构造函数参数或参数,或通过依赖注入(inject)框架来完成。

以下是重写类以使其更易于测试的方法:

public class DataClient {

private String userName, bucket, region, accessKey, secretKey;
private AmazonS3Client s3;

public OdwClient(String accessKey, String secretKey, String userName, String bucket, String region){
this(accessKey, secretKey, userName, bucket, region, new AmazonS3Client(new BasicAWSCredentials(accessKey, secretKey));
}

public OdwClient(String accessKey, String secretKey, String userName, String bucket, String region, AmazonS3Client s3){
this.accessKey = accessKey;
this.accessKey = secretKey;
this.userName = userName;
this.bucket = bucket;
this.region = region;
this.s3 = s3;
}

public boolean pushData(String fileName) {
s3.putObject(new PutObjectRequest("bucketName", fileName, new File("filePath")).
return true;
}
}

然后您可以使用真正的 DataClient 实例而不是模拟,并为新的 DataClient 构造函数模拟 s3 实例。模拟 AmazonS3Client 实例后,您可以使用典型的模拟工具从其方法中提供预期的响应。

关于java - 如何根据服务调用模拟私有(private)成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37465664/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com