如何使用Java Mockito执行单元测试

时间:2018-11-26 11:27:14

标签: java junit mockito

我正在尝试使用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.

    }
}

1 个答案:

答案 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的其他部分。但这确实是一项高级功能,很可能不是您应该首先研究的主题。