2013-03-08 6 views
0

Я довольно новичок в написании mock classes. Я пытаюсь написать тестовый класс для метода ниже, и я не могу продолжать издеваться над вызовом метода getSsnValue.Чтобы издеваться над методом, возвращающим void

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

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

Ниже тест написан для насмехаясь метод «getSsnField» и работает fine.Can кто поможет в понимании того, как издеваются метод пустот «getSsnValue», так что этот метод не будет выполняться во время вызова " 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) возвращает поле, то getSsnValue() вызывается с тем же fieldValue ,

Если вы хотите продолжить движение по этому пути, вот что вам нужно сделать. В 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); 
Смежные вопросы