2013-05-12 51 views
4

我有一个简单的方法,返回StringMockito与局部变量

它还创建了一个本地List。我想测试添加到当地List的值。

下面是一个例子

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"; 
    } 
} 

如何测试,当customerVo.getName.equals("Terry")car被添加到本地List

+2

ArrayList纯粹是本地的方法,它不会被添加到CustomerVo,所以你不能测试任何东西。就好像它不存在一样。 – 2013-05-12 10:13:45

+2

+1给Frank。该方法可以简化为“返回”dummyString“;”并且仍然执行相同的操作,但效率更高。 – 2013-05-12 10:23:17

+0

非常感谢答复,基本上这是一个虚拟方法,用于询问我们是否可以测试局部变量。 – user1999453 2013-05-12 10:30:30

回答

3

这并不是那么容易。

您需要使用类似powermock的东西。

随着powermock创建创建之前那么方法被调用的场景和回放,这意味着你可以告诉ArrayList类的构造函数来预测被称为并返回mock,而不是一个真正的ArrayList

这将允许您在mock上声明。

像这样的东西应该工作:

ArrayList listMock = createMock(ArrayList.class); 
expectNew(ArrayList.class).andReturn(listMock); 

所以,当你的方法创建本地List powermock实际上将返回你的模拟List

更多信息here

这种嘲讽实际上是对遗留代码进行单元测试,而这些遗留代码是不可测试的。如果可以的话,我强烈建议重写代码,以避免发生如此复杂的嘲讽。

+2

@ user1999453我想补充说,这种测试非常脆弱,因为它实际上取决于方法的内部实现,而不是测试其结果或效果。如果你现在需要创建第二个ArrayList呢?它有50%的机会打破测试。 – 2013-05-12 13:12:25