如何使用Mockito在整个系统中模拟一个类

时间:2014-06-26 00:02:14

标签: java unit-testing mocking mockito

我有一个这样的方法,我试图用Mockito测试:

public class MiscUtil{

    public int getValue(String key){
        Properties properties = new Helper().getProperties() //This is the method 
                                                             //I need to mock
        return properties.get(key)
    }

这是测试类:

public class MiscUtilTest{

public void testGetBooleanValue() {

    Properties properties = new Properties();
    properties.setProperty(MY_SPECIAL_INT_PROPERTY, 10);
    // Mock Helper
    Helper mock = Mockito.mock(Helper.class);
    // mock the method getProperties()
    Mockito.when(mock.getProperties()).thenReturn(properties);

    // Assert that the getValue() method 
    Assert.assertEquals(10,MiscUtil.getValue(MY_SPECIAL_int_PROPERTY));

然而,该方法并未被嘲笑。我是否必须将实际的模拟实例传递给MiscUtil类才能使模拟生效? MiscUtil类不允许我将Helper对象传递给它。在JMockit中模拟任何类的特定方法非常容易,即使上层类可能无法访问它。是否有可能在Mockito中这样做?

2 个答案:

答案 0 :(得分:0)

如果您只是尝试测试getValue()方法的行为,则需要提供(模拟)方法所需的对象。

MiscUtil类需要Helper对象的实例。所以你需要通过MiscUtils'传递这个对象。构造函数(或其他方式),因为它是此类的依赖

所以,如果它是依赖并且你想要测试我应该嘲笑,你只会打电话给你的真实方法想要测试(MiscUtil.getValue(MY_SPECIAL_int_PROPERTY))。

答案 1 :(得分:0)

你必须传回模拟对象,否则,Mockito将不知道它的getProperties方法被调用。

您需要添加一个方法来在MiscUtil类中注入Helper:

private Helper helper;
public Helper getHelper()
{
     return helper;
}
public void setHelper(Helper helper)
{
     this.helper = helper;
}

更新MiscUtil类以使用您注入的Helper:

    public int getValue(String key){
    Properties properties = getHelper().getProperties() //This is the method 
                                                         //I need to mock
    return properties.get(key)
}

然后将此模拟对象重新设置回MiscUtil:

MiscUtil.setHelper(mock);

现在,Mockito嘲笑应该有效