java - 如何使用 Java Mockito 执行单元测试
问题描述
我正在尝试使用 测试此代码mockito
,因此需要模拟result
as 错误并测试代码。在这种情况下,我将其硬编码result
为 1。
public class RetrieveData {
public int retrieveMetaData() {
int retries = 0;
int result = 0;
int MAX_RETRIES = 3;
while (retries++ < MAX_RETRIES) {
try {
result = 1;
} catch (Exception e) {
if(retries < MAX_RETRIES) {
System.out.println(" retries :" + retries );
} else {
throw e;
}
}
}
return result;
}
public static void main(String[] args) {
int result ;
RetrieveData obj = new RetrieveData();
result = obj.retrieveMetaData();
System.out.println(result);
}
}
模拟:
import org.junit.Test;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
public class TestretrieveMetaData {
@Test
public void test_retrieveMetaData() throws Exception {
RetrieveData resultObj = mock(RetrieveData.class);
// how to add the mock for the result.
}
}
解决方案
首先,你要明白你打算做什么!
你看,你要么模拟一个类 X ... 因为某个类 Y 中使用了 X 的一个实例,并且你打算测试Y。或者你打算测试X 类,但是你不应该模拟 X 的实例!要么测试 X,要么使用 X 来测试其他东西。
假设您想模拟您的 class 实例RetrieveData
,您只需执行以下操作:
RetrieveData resultObj = Mockito.mock(RetrieveData.class);
Mockito.when(resultObj.retrieveMetaData()).thenReturn(42);
因此,为了与 Tobb 的评论保持一致:您不能单独“模拟”该结果字段。如果有的话,您可以模拟您的课程的完整实例。但如前所述:只有在您打算测试的另一个类中使用该实例时,这才有意义。
长话短说:如前所述,真正的问题是您正在尝试使用您根本不理解的概念(这里没有判断)。我的建议:首先阅读一个关于Mockito的好教程。然后花了很多时间思考“我怎样才能编写可以以合理方式测试的代码”。您尝试从第 10 步开始,但这行不通,因为您只能在之前执行第 1 到第 9 步时这样做,并了解它们的含义。
是的,当你想“部分模拟”时,你可以使用 Mockito间谍。使用它,您可以测试 X 的某些部分,同时“模拟”X 的其他部分。但这确实是一个高级功能,很可能不是您应该首先研究的主题。
推荐阅读
- java - 如果我按 Enter 或关闭键盘,EditText 会更改大小
- sip - Linphone opus 编解码器采样率
- components - 在 App 组件旁边动态呈现 Blazor 组件
- python - 输入负数时显示错误消息。我应该使用 try 语句以及如何使用?
- ffmpeg - FMP4 moof box序列号排序
- vim - 我可以在 CGDB 中映射 SHIFT+F11 Visual Studio 调试器快捷方式吗?
- python - 以编程方式更改监视器输入源
- django - 无法将用户分配给更改模型对象的模型对象
- amazon-web-services - 如何将数组存储到 dynamoDB 表中
- r - R GLM:修改现有 glm 模型的系数