В нашей comapny у нас есть сервисный уровень, который принимает некоторый запрос XML, обращается к различным хранимым Procecdures (SP) через JDBC, обрабатывает данные и отвечает на некоторые ответы XML. В последнее время люди начали принимать MockRunner в своих тестах JUnit, чтобы издеваться над ответами SP. Код для установки на издевались отклики с помощью MockRunner СП выглядит ужасно (это первый случайный тест класс я открыл):Почему я должен использовать MockRunner для нормальной/ручной прокатки зависимости?
MockConnection connection = new MockConnection();
MockContextFactory.setAsInitial();
InitialContext context = new InitialContext();
context.rebind(READ_PAYMENT_DATA_SOURCE, getDS());
getDS().setupConnection(connection);
m_csStatementHandler = connection.getCallableStatementResultSetHandler();
m_csStatementHandler.clearResultSets();
m_csStatementHandler.clearCallableStatements();
m_csStatementHandler.setExactMatch(false);
m_csStatementHandler.prepareReturnsResultSet(READ_PAYMENT, true);
m_csStatementHandler.setExactMatch(false);
m_csStatementHandler.setExactMatchParameter(false);
Map parameterMap = new HashMap();
parameterMap.put(new Integer(1), null);
parameterMap.put(new Integer(2), null);
parameterMap.put(new Integer(3), null);
parameterMap.put(new Integer(4), null);
m_csStatementHandler.prepareOutParameter(READ_PAYMENT, parameterMap);
//Set up the cursor of applications for return.
MockResultSet resultApps = m_csStatementHandler.createResultSet();
resultApps.addRow(getPaymentSchedule("E", "Monthly", new Short("1"),null,null,null,null,null,null,null));
resultApps.addRow(getPaymentSchedule("A", "Weekly", new Short("1"),null,null,null,null,null,null,null));
resultApps.addRow(getPaymentSchedule("R", "Yearly", new Short("1"),null,null,null,null,null,null,null));
resultApps.addRow(getPaymentSchedule("S", "Weekly", new Short("1"),null,null,null,null,null,null,null));
resultApps.addRow(getPaymentSchedule("W", "Monthly", new Short("1"),null,null,null,null,null,null,null));
MockResultSet[] results = new MockResultSet[1];
results[0] = resultApps;
m_csStatementHandler.prepareResultSet(READ_PAYMENT, resultApps);
выше код ужасен по многим причинам, но это ясно показывает сложность и накладные расходы на настройку ответа от хранимых процедур.
На данный момент я использовал инъекцию зависимостей вручную, чтобы ввести класс, который фактически вызывает хранимую процедуру. Все, что мне нужно сделать, это создать класс вызова вызывающего модуля SP (отвечающий за фактическое выполнение SP) и установить мои требуемые данные ответа. Я очень доволен этой техникой и ее намного проще, чем выше, поскольку ее данные сосредоточены, а не беспокоятся о деталях реализации. Но мой вопрос: когда вы хотите использовать MockRunner? Кажется, излишним для модульных тестов, так что я предполагаю, что он больше подходит для интеграции или тестирования системы? И даже тогда мне по-прежнему проще использовать фреймворк DI для замены класса вызывающего SP, а затем настроить весь код выше для каждого вызова хранимой процедуры. Пожалуйста, просветите! Спасибо
Спасибо за это. Я знаком с Мокито, который мне очень нравится. –