Java 局部变量的Mockito

Java 局部变量的Mockito,java,unit-testing,junit,mocking,mockito,Java,Unit Testing,Junit,Mocking,Mockito,我有一个简单的方法返回字符串 它还创建一个本地列表。我想测试添加到本地列表中的值 这里有一个例子 package com.impl; import java.util.ArrayList; import java.util.List; import com.test.domain.CustomerVo; public class ClassImpl { public String assignGift(CustomerVo customerVo) { List&l

我有一个简单的方法返回
字符串

它还创建一个本地
列表
。我想测试添加到本地
列表中的值

这里有一个例子

package com.impl;

import java.util.ArrayList;
import java.util.List;

import com.test.domain.CustomerVo;

public class ClassImpl {

    public String assignGift(CustomerVo customerVo) {
        List<String> listOfGift = new ArrayList<String>();

        if (customerVo.getName().equals("Joe")) {
            listOfGift.add("ball");
        } else if ((customerVo.getName().equals("Terry"))) {
            listOfGift.add("car");
        } else if (customerVo.getName().equals("Merry")) {
            listOfGift.add("tv");
        }else {
            listOfGift.add("no gift");
        }

        return "dummyString";
    }
}
package com.impl;
导入java.util.ArrayList;
导入java.util.List;
导入com.test.domain.CustomerVo;
公共类ClassImpl{
公共字符串分配礼品(CustomerVo CustomerVo){
List listOfGift=new ArrayList();
if(customerVo.getName().equals(“Joe”)){
添加(“球”);
}else if((customerVo.getName().equals(“Terry”)){
提升列表添加(“car”);
}else if(customerVo.getName().equals(“Merry”)){
提升列表添加(“tv”);
}否则{
添加礼物清单(“无礼物”);
}
返回“dummyString”;
}
}

customerVo.getName.equals(“Terry”)
car
被添加到本地
列表中时,我如何测试这一点?这并不容易

你需要使用类似的东西

使用powermock,您可以在调用方法之前创建一个场景并播放它,这意味着您可以告诉
ArrayList
类构造函数预期被调用并返回一个
mock
而不是一个真正的
ArrayList

这将允许您在
mock
上断言

这样的事情应该行得通:

ArrayList listMock = createMock(ArrayList.class);
expectNew(ArrayList.class).andReturn(listMock);
因此,当您的方法创建本地
列表时,powermock实际上会返回您的mock
列表

更多信息


这种模拟实际上是用于对未编写为可测试的遗留代码进行单元测试。如果可以的话,我强烈建议您重写代码,这样就不需要进行如此复杂的模拟。

这并不是那么容易

你需要使用类似的东西

使用powermock,您可以在调用方法之前创建一个场景并播放它,这意味着您可以告诉
ArrayList
类构造函数预期被调用并返回一个
mock
而不是一个真正的
ArrayList

这将允许您在
mock
上断言

这样的事情应该行得通:

ArrayList listMock = createMock(ArrayList.class);
expectNew(ArrayList.class).andReturn(listMock);
因此,当您的方法创建本地
列表时,powermock实际上会返回您的mock
列表

更多信息


这种模拟实际上是用于对未编写为可测试的遗留代码进行单元测试。如果可以的话,我强烈建议您重写代码,这样就不需要进行如此复杂的模拟。

ArrayList是该方法的纯本地列表,它没有添加到CustomerVo,因此您无法测试任何东西。就好像它不存在一样。该方法可以简化为
返回“dummyString”
仍然可以做同样的事情,但效率更高。非常感谢您的回答基本上这是一个虚拟方法,用来询问我们是否可以测试局部变量。@user1999453您应该在问题中清楚地说明这一点。我们要说的是,您不应该尝试测试局部变量的值。方法的测试应该考虑方法的效果:返回值、抛出的异常、修改的参数或类字段、类外部的其他副作用。如果局部变量的值不影响其中一个,则该局部变量是无用的,应该删除。ArrayList对于方法来说是纯局部的,它没有添加到CustomerVo,因此您无法测试任何内容。就好像它不存在一样。该方法可以简化为
返回“dummyString”
仍然可以做同样的事情,但效率更高。非常感谢您的回答基本上这是一个虚拟方法,用来询问我们是否可以测试局部变量。@user1999453您应该在问题中清楚地说明这一点。我们要说的是,您不应该尝试测试局部变量的值。方法的测试应该考虑方法的效果:返回值、抛出的异常、修改的参数或类字段、类外部的其他副作用。如果局部变量的值不影响其中一个,则该局部变量是无用的,应该删除。@user1999453我要补充的是,这种测试方式非常脆弱,因为它实际上依赖于方法的内部实现,而不是测试其结果或效果。如果现在需要创建第二个ArrayList呢?它有50%的几率破坏测试。@user1999453我要补充的是,这种测试方式非常脆弱,因为它实际上依赖于方法的内部实现,而不是测试其结果或效果。如果现在需要创建第二个ArrayList呢?它有50%的机会通过测试。