首页 > 解决方案 > 如何使用 Java Mockito 执行单元测试

问题描述

我正在尝试使用 测试此代码mockito,因此需要模拟resultas 错误并测试代码。在这种情况下,我将其硬编码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.

    }
}

标签: javajunitmockito

解决方案


首先,你要明白你打算做什么!

你看,你要么模拟一个类 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 的其他部分。但这确实是一个高级功能,很可能不是您应该首先研究的主题。


推荐阅读