Я пытаюсь издеваться над классом вызова groovy.sql.Sql (query, params [], closure). Ниже приведен метод в файле класса DatabaseService, на котором я пытаюсь это сделать.
public void getUsers(List<User> developerList, Sql sql) {
sql.call("{? = call GETUSERS()}", [Sql.resultSet(OracleTypes.CURSOR)]) { result ->
while (result.next()) {
User user = new User()
user .email = result.EMAIL
user .lastName = result.LASTNAME
}
}
}
Мой макет действительно выполняет задачу, однако я не хочу, чтобы имитированное закрытие выполнялось. Я хочу издеваться над методом .call (,, _), чтобы пропустить только логику базы данных и вернуть список в закрытие в методе getUsers (). Я хочу, чтобы закрытие выполнялось в методе getUsers (), а не в макетном методе.
Ниже представлен макет, который я написал в SPOCK.
void "test getUsers(list,sql) some results"() {
DataSource mockedSource = Mock(DataSource)
Sql mockedSql = Mock(Sql)
DatabaseService databaseService = new DatabaseService()
databaseService.dataSource = mockedSource
List<User> userList= new ArrayList<>();
when:
databaseService.getUsers(userList, mockedSql)
then:
1 * mockedSql.call(_, _, _) >> { return [[EMAIL: "A", LASTNAME: "B"]] }
userList.size() == 1
}
Как и предполагалось, этот макет перезаписывает исходное закрытие метода, и мой список никогда не заполняется. Я, конечно, не хочу переписывать свой класс для использования Java, и я не могу изменить выполняемую хранимую процедуру.