我正在尝试使用mockito
测试此代码,因此需要将result
模拟为错误并测试代码。在这种情况下,我已经将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);
}
}
Mockito:
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.
}
}
答案 0 :(得分:3)
首先,您必须了解您打算做什么!
您看到的,您或者都模拟了类X ...,因为在某个类Y中使用了X的实例,并且您打算测试 Y 。或者,您打算测试 X类,但是您不应该模拟X实例!您要么测试X,要么使用X来测试其他东西。
假设您要模拟类RetrieveData
的实例,只需执行以下操作:
RetrieveData resultObj = Mockito.mock(RetrieveData.class);
Mockito.when(resultObj.retrieveMetaData()).thenReturn(42);
因此,要与Tobb的评论保持一致:您不能单独“模拟”该结果字段。如果有的话,您可以模拟类的完整实例。但是请注意:只有在要测试的另一个类中使用该实例时,这才有意义。
长话短说:如上所述,真正的问题是您正在尝试使用根本不理解的概念(此处没有判断力)。我的建议:首先阅读有关Mockito的精彩教程。然后花了很多时间思考“如何编写可以以合理方式测试的代码”。您正尝试从步骤10开始,但这将不起作用,因为您只能在之前执行步骤1至9并了解其含义后才能这样做。
是的,当您要“部分嘲笑”时,您可以 使用Mockito spy。使用它,您可以测试X的各个部分,同时也可以“模拟” X的其他部分。但这确实是一项高级功能,很可能不是您应该首先研究的主题。