gpt4 book ai didi

java - 使用 AWS SDK 的最终类进行单元测试

转载 作者:行者123 更新时间:2023-12-01 14:28:37 28 4
gpt4 key购买 nike

我编写了以下代码来发布一些关于 AWS Step 函数的指标(它的 aws 的 java lambda)

@Override
public void handleRequest(InputStream input, OutputStream output, Context context) throws IOException {
int inProgressStateMachines = 0;

LocalDateTime now = LocalDateTime.now();

long alarmThreshold = getAlarmThreshold(input, context.getLogger());

AWSStepFunctions awsStepFunctions = AWSStepFunctionsClientBuilder.standard().build();

ListStateMachinesRequest listStateMachinesRequest = new ListStateMachinesRequest();
ListStateMachinesResult listStateMachinesResult = awsStepFunctions.listStateMachines(listStateMachinesRequest);

for (StateMachineListItem stateMachineListItem : listStateMachinesResult.getStateMachines()) {

ListExecutionsRequest listExecutionRequest = new ListExecutionsRequest()
.withStateMachineArn(stateMachineListItem.getStateMachineArn())
.withStatusFilter(ExecutionStatus.RUNNING);

ListExecutionsResult listExecutionsResult = awsStepFunctions.listExecutions(listExecutionRequest);

for (ExecutionListItem executionListItem : listExecutionsResult.getExecutions()) {

LocalDateTime stateMachineStartTime = LocalDateTime.ofInstant(
executionListItem.getStartDate().toInstant(), ZoneId.systemDefault());

long elapsedTime = ChronoUnit.SECONDS.between(stateMachineStartTime, now);

if (elapsedTime > alarmThreshold){
inProgressStateMachines++;
}
}

publishMetrics(inProgressStateMachines);
}
}

现在我正在尝试对该方法进行单元测试,但遇到了一些问题。

首先,当我尝试模拟 AWSStepFunctionsClientBuilder 时,我收到错误提示 Mockito can not mock final class

其次,我有使用特定参数调用的私有(private)方法。

问题是

  1. 我如何对这段代码进行单元测试?我在某处读到,如果代码不可单元测试,那么它就是一个糟糕的设计。我如何改进此代码以使其易于测试?我更愿意将这些辅助方法保留为 private 方法。

  2. 如何从 AWS SDK 模拟 final 对象来测试此代码?除了 Mockito,我不能使用任何其他框架。

最佳答案

您实际上不想模拟 AWSStepFunctionsClientBuilder,因为您实际上是在调用 AWSStepFunctions,即使在模拟构建器之后,您仍然必须模拟它。

所以让 AWSStepFunctions 成为一个实例变量:

// add appropriate getter/setter as well
private AWSStepFunctions awsStepFunctions;

当前调用构建器初始化awsStepFunctions的地方,改为:

if (awsStepFunctions == null)
awsStepFunctions = AWSStepFunctionsClientBuilder.standard().build();

现在,在单元测试期间,您可以将 awsStepFunctions 设置为模拟实例,绕过上面的条件初始化。

[编辑] 基于@kdgregory 下面的评论的更多想法:

上面的答案是为了在现有代码结构的情况下提供解决方案,而不需要进行任何重大重构。但一般来说,理想情况下,您希望将大部分代码移动到另一个更简单、更可测试的 Java 类中,您可以在其中正确注入(inject)依赖项、管理生命周期等。

关于java - 使用 AWS SDK 的最终类进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48304385/

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