模拟返回void的方法

时间:2013-03-08 09:40:25

标签: easymock powermock

我是编写模拟类的新手。我正在尝试为下面的方法编写一个测试类,我无法继续模拟方法调用" getSsnValue"。

public void setFieldValue(String fieldValue) {
    final Field<String> SSN = getSsnField(fieldValue);

    if (SSN !=null) {       
        getSsnValue(SSN ,fieldValue);
    }
}

以下是为模拟方法而编写的测试&#34; getSsnField&#34;并且工作正常。任何人都可以帮助理解如何模拟void方法&#34; getSsnValue&#34;因此在调用期间不会执行此方法&#34; controller.setFieldValue(name);&#34;

代码段:

controller = EasyMock.createMockBuilder(Controller.class).addMockedMethod("getSsnField",String.class).createMock(); 
EasyMock.expect(controller.getSsnField((String)EasyMock.anyObject())).andReturn(SSN).anyTimes();                
EasyMock.replay(controller);           
controller.setFieldValue(name);

1 个答案:

答案 0 :(得分:1)

你是否在嘲笑这些方法,因为他们做了一些你在测试中无法承担的沉重负担?我问的原因是,IMO,如果你必须创建这样的局部模拟,以模拟对同一类中的方法的调用,那么你可能在一个太细粒度的水平上进行测试。换句话说,你真的需要嘲笑那些方法吗?

我还假设,如果你想要模拟那些内部方法,那么测试的唯一原因必须是确保如果getSsnField(fieldValue)返回一个Field,则使用相同的fieldValue调用getSsnValue()。

如果您想继续沿着这条路走下去,这就是您需要做的事情。在EasyMock中,要模拟一个void方法,你不要使用expect(...);相反,您只需在模拟对象上直接调用该方法(在调用replay()之前)。这样做会指示EasyMock创建期望将调用该void方法。

Controller controller = EasyMock.createMockBuilder(Controller.class)
    .addMockedMethod("getSsnField", String.class)//
    .addMockedMethod("getSsnValue")//
    .createMock();
Field<String> SSN = new Field<String>();
String name = "name";
EasyMock.expect(controller.getSsnField(name)).andReturn(SSN).anyTimes();
// Just calling the getSsnValue method on the mock sets up the expectation
// that it must be called
controller.getSsnValue(SSN, name); // Mocking void method here
EasyMock.replay(controller);
controller.setFieldValue(name);

// This step is needed in order to enforce that all mocked methods were
// actually called.
EasyMock.verify(controller);