1

我对编写模拟类相当陌生。我正在尝试为以下方法编写一个测试类,但我无法继续模拟方法调用“getSsnValue”。

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

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

下面是为模拟方法“getSsnField”而编写的测试并且工作正常。任何人都可以帮助理解如何模拟 void 方法“getSsnValue”,以便在调用“controller.setFieldValue(name); "

代码片段:

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);
4

1 回答 1

1

您是否在嘲笑这些方法,因为它们做了一些您在测试中负担不起的繁重工作?我问的原因是因为,IMO,如果你必须创建一个像这样的部分模拟来模拟对生活在同一个类中的方法的调用,那么你可能在一个太细粒度的级别上进行测试。换句话说,你真的需要模拟这些方法吗?

我还假设,如果您确实想模拟这些内部方法,那么测试的唯一原因必须是确保如果 getSsnField(fieldValue) 返回一个字段,则使用相同的 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);
于 2013-03-13T15:49:32.167 回答