2013-03-08 158 views
0

我对编写模拟类很新,我正在尝试为下面的方法编写一个测试类,并且我无法继续模拟方法调用“getSsnValue”。模拟一个返回void的方法

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

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

下面是嘲讽法“getSsnField”书面测试并了解如何嘲笑无效方法“getSsnValue”,使这种方法不会通话“期间执行工作fine.Can任何人的帮助controller.setFieldValue(名称);”

代码段:

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

你是否嘲笑那些方法,因为他们做一些繁重工作,你无法负担在您的测试呢?我问的原因是IMO,如果你必须创建一个这样的部分模拟来嘲笑调用同一个类的方法,那么你可能在一个太细的级别上进行测试。换句话说,你真的需要嘲笑这些方法吗?我也假设,如果你想嘲笑那些内部方法,那么测试的唯一原因必须是确保如果getSsnField(fieldValue)返回一个Field,那么getSsnValue()被调用相同的fieldValue 。

如果你想继续下去,你需要做什么。在EasyMock中,为了嘲笑一个无效的方法,你不要使用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); 
相关问题