Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Java Mockito执行单元测试_Java_Junit_Mockito - Fatal编程技术网

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

如何使用Java Mockito执行单元测试,java,junit,mockito,Java,Junit,Mockito,我正在尝试使用mockito测试此代码,因此需要将结果模拟为错误并测试代码。在本例中,我已将结果硬编码为1 public class RetrieveData { public int retrieveMetaData() { int retries = 0; int result = 0; int MAX_RETRIES = 3; while (retries++ < MAX_RETRIES) {

我正在尝试使用
mockito
测试此代码,因此需要将
结果
模拟为错误并测试代码。在本例中,我已将
结果
硬编码为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);
    }
}

首先,你必须明白你打算做什么

你看,你要么模仿一个X类。。。因为某个类Y中使用了X的一个实例,您打算测试Y。或者您打算测试类X,但不应该模拟X的实例!要么测试X,要么使用X测试其他东西

假设要模拟类的实例
RetrieveData
,只需执行以下操作:

RetrieveData resultObj = Mockito.mock(RetrieveData.class);
Mockito.when(resultObj.retrieveMetaData()).thenReturn(42);
因此,为了与Tobb的评论保持一致,您不能单独“模拟”结果字段。如果有的话,您可以模拟类的完整实例。但正如前面所说的:只有在您打算测试的另一个类中使用该实例时,这才有意义

长话短说:如前所述,真正的问题是你试图使用你根本不理解的概念(这里没有判断)。我的建议是:从阅读一本关于这方面的好教程开始。然后,我花了很多时间思考“我怎样才能编写我能够以合理方式进行测试的代码”。你正试图从第10步开始,但那是行不通的,因为你只能在之前做了第1步到第9步,并且理解它们是关于什么的时候才能这样做


是的,当你想“部分模仿”的时候,你可以使用Mockito。使用它,您可以测试X的某些部分,同时也可以“模拟”X的其他部分。但这确实是一个高级功能,很可能不是您应该首先学习的主题

首先,你必须明白你打算做什么

你看,你要么模仿一个X类。。。因为某个类Y中使用了X的一个实例,您打算测试Y。或者您打算测试类X,但不应该模拟X的实例!要么测试X,要么使用X测试其他东西

假设要模拟类的实例
RetrieveData
,只需执行以下操作:

RetrieveData resultObj = Mockito.mock(RetrieveData.class);
Mockito.when(resultObj.retrieveMetaData()).thenReturn(42);
因此,为了与Tobb的评论保持一致,您不能单独“模拟”结果字段。如果有的话,您可以模拟类的完整实例。但正如前面所说的:只有在您打算测试的另一个类中使用该实例时,这才有意义

长话短说:如前所述,真正的问题是你试图使用你根本不理解的概念(这里没有判断)。我的建议是:从阅读一本关于这方面的好教程开始。然后,我花了很多时间思考“我怎样才能编写我能够以合理方式进行测试的代码”。你正试图从第10步开始,但那是行不通的,因为你只能在之前做了第1步到第9步,并且理解它们是关于什么的时候才能这样做


是的,当你想“部分模仿”的时候,你可以使用Mockito。使用它,您可以测试X的某些部分,同时也可以“模拟”X的其他部分。但这确实是一个高级功能,很可能不是您应该首先学习的主题

无关:阅读java命名约定。类名总是大写的。通常的做法是为X.java命名测试类。。。只需XTest.java。。。而不是Testx。因为
result
被设置为被测试的类/方法中的一个原语,所以无法模拟它。而且,它不应该被嘲笑。如果它被设置为对另一个类的方法调用的结果,那么您将模拟此调用。类名总是大写的。通常的做法是为X.java命名测试类。。。只需XTest.java。。。而不是Testx。因为
result
被设置为被测试的类/方法中的一个原语,所以无法模拟它。而且,它不应该被嘲笑。如果它被设置为对另一个类的方法调用的结果,您将模拟此调用。