Фабрика будет работать. По сути, вы делаете инъекцию зависимостей на фабрике. Когда вы создаете экземпляр или инициализируете свое действие, вы устанавливаете фабрику:
public void setResponseFactory(ResponseBuilderFactory factory) {
this.responseFactory = factory;
}
и на фабрике просто возвращайте новый экземпляр JsonResponseBuilder
, когда вам это нужно. Убедитесь, что вы не сохраняете свой экземпляр JsonResponseBuilder
как переменную экземпляра в своем действии; он должен оставаться локальным для используемого вами метода или передаваться как параметр метода.
Что касается тестирования, становится легко заменить фабрику фиктивной фабрикой, которая возвращает фиктивный ResponseBuilder. Для этого существует множество библиотек, например Mockito или JMock . Все они хорошо работают с JUnit и TestNG.
Edit:
Вам потребуется интерфейс ResponseBuilderFactory, например:
public interface ResponseBuilderFactory {
public ResponseBuilder getResponseBuilder();
}
Когда вы проводите тестирование, просто создайте класс, который возвращает макет вашего ResponseBuilder:
@Test
public void testMyAction() throws Exception {
ResponseBuilderFactory mockFactory = new ResponseBuilderFactory() {
public ResponseBuilder getResponseBuilder() {
ResponseBuilder builder = context.mock(ResponseBuilder.class);
// set up mock behaviour
return builder;
}
}
}
То есть, вы не вводите фиктивную фабрику, а просто фабрику, которая возвращает ложную информацию.
Также см. Инъекция зависимости от заводской модели .
Редактировать 2:
Если вам удастся каким-либо образом перекодировать ваш JsonResponseBuilder
, чтобы он не поддерживал состояние, тогда вы могли бы потенциально избежать всей заводской путаницы и просто использовать свой оригинальный подход. Объекты, которые не поддерживают состояние, по своей сути поточно-ориентированы.