Да, вы можете сделать то, что вы предложили, или:
Создать класс Factory, в котором вы создаете Builder
объекты, и назначить его классу чтения.В своих модульных тестах смоделируйте эту фабрику и заставьте ее построить Builder
по вашему выбору, чтобы вы могли проверять вызовы методов в своем модульном тесте.
Вот пример использования EasyMock , показывающий, как этого можно достичь:
public class Reader{
private BuilderFactory factory = new BuilderFactory(); // Use production factory by default
public Builder importFrom(BufferedReader reader) throws IOException {
String someValue = readFrom(reader);
Builder builder = factory.buildBuilder();
builder.someMethod(someValue); // to see of a method is called with the expected value
}
}
В своих модульных тестах вы делаете следующее:
Reader classUnderTest = new Reader();
BuilderFactory fakeFactory = EasyMock.createNiceMock(BuilderFactory.class);
Builder builder = EasyMock.createMock(Builder.class);
EasyMock.expect(fakeFactory.buildBuilder()).andReturn(builder);
builder.someMethod("value here");
EasyMock.expectLastCall().once();
EasyMock.replay(fakeFactory, builder);
classUnderTest.importFrom(bufferReader);
// Very that all calls were correctly performed on the builder
EasyMock.verify(builder);