2016-06-01 1 views
0

Можем ли мы выполнить SQL без реального подключения к базе данных в java? пример:Можем ли мы выполнить SQL без реального подключения к базе данных в java?

SELECT CASE 
      WHEN :param = 1 THEN 'TEST1' 
      WHEN :param = 2 THEN 'TEST2' 
      WHEN :param = 3 THEN 'TEST3' 
     END 
      AS RESULT 
FROM DUAL 

заменит: пары во время выполнения в Java коде ... Есть ли способ сделать это?

Я нашел эту ссылку: How do I extract selected columns given an Oracle SQL String?

, но не быстрое решение не предусмотрено в этой ссылке

В настоящее время думает: - фиктивной связи HSQLDB и выполнить SQL запрос. Но для этого требуется развернуть новую память db.

Есть ли еще лучше & Быстрое решение?

Благодаря

+3

Что вы пытаетесь достичь? Я не уверен, что понимаю, что означает «Выполнять sql без подключения к базе данных» означает ... какова ваша цель? – Kritner

+0

Какие данные вы хотите запустить, если таковые имеются? Мне непонятно, чего вы хотите достичь, не могли бы вы уточнить? – JonasCz

+1

Вы не можете выполнить SQL-запрос без базы данных SQL. Ничто не сможет обработать запрос. – Jehy

ответ

0

Я хочу, чтобы выполнить выражение случая и получить данные .. Я пытаюсь с JSQLParser. Выше пример должен вернуть «Test1» в качестве выходного сигнала

но почему вы пытаетесь сделать? Ваше намерение выполнить проверку вашего запроса? или код, вызывающий запрос?

Если вы пытаетесь объединить тестовые объекты базы данных, возможно, вам лучше включить его в процесс и использовать платформу тестирования модулей базы данных. Some info on oracle unit testing. Я предполагаю, что оракул основан на двойственном.

Если вы пытаетесь протестировать свой Java-код, вам нужно подумать о том, чтобы вытащить запрос непосредственно из метода, который вы пытаетесь протестировать, и программирования для интерфейса, которому вы можете обеспечить «реальную» реализацию, и макет или фальшивая реализация. Таким образом, вы проверяете независимость от самого вызова db.

Пример того, что я имею в виду в коде, и жаль, что это будет немного грубо, как я меньше знакомы с Java по сравнению с #

что у вас есть:

public class ClassINeedToTest { 
    public void myMethodThatNeedsTesting(int param1) { 
     // do some stuff 

     // implementation of sql code ... not real since I don't know how to call SQL from java 
     SELECT CASE 
      WHEN :param = 1 THEN 'TEST1' 
      WHEN :param = 2 THEN 'TEST2' 
      WHEN :param = 3 THEN 'TEST3' 
     END 
      AS RESULT 
     FROM DUAL 

     // potentially do some other stuff? 
    } 
} 

So , как указано выше, если вы намерены протестировать сам SQL, вы, вероятно, должны вытащить буквальный SQL-код, поместить его в хранимую процедуру и использовать инфраструктуру модульного тестирования для проверки результата proc в нескольких сценариях, таких как param value = 1, 2 и 3.

Но, если вы хотите протестировать окружающие // Do stuff и/или // potentially do some other stuff? без зависимости от возможности подключения к базе данных, вам нужно будет сделать довольно простой рефакторинг.

Метод myMethodThatNeedsTesting имеет зависимость от базы данных, которую мы должны абстрагироваться от использования интерфейса, чтобы иметь возможность протестировать метод myMethodThatNeedsTesting, не полагаясь на реальное соединение с базой данных.

Это может выглядеть примерно так:

public interface ISomeInterface { 
    string getInfo(int param1); 
} 

я определил выше, чтобы быть представление о том, что представляет собой запрос.Запрос требует параметра (param1) и возвращает скалярную строку (результат из вашего запроса).

Учитывая этот интерфейс, вы можете реорганизовать свой оригинальный класс выглядеть следующим образом:

public interface ISomeInterface { 
    string getInfo(int param1); 
} 

public class MySomeInterfaceImpl implements ISomeInterface { 
    @override 
    public string getInfo(int param1) { 
     // implementation of sql code ... not real since I don't know how to call SQL from java 
     SELECT CASE 
      WHEN :param = 1 THEN 'TEST1' 
      WHEN :param = 2 THEN 'TEST2' 
      WHEN :param = 3 THEN 'TEST3' 
     END 
      AS RESULT 
     FROM DUAL 
    } 
} 

public class ClassINeedToTest { 

    private ISomeInterface _myInterface; 

    public ClassINeedToTest(ISomeInterface iSomeInterface) { 
     _myInterface = iSomeInterface; 
    } 

    public void myMethodThatNeedsTesting(int param1) { 
     // do some stuff 

     _myInterface.getInfo(param1); 

     // potentially do some other stuff? 
    } 
} 

В выше, вы можете видеть, что метод myMethodThatNeedsTesting не теперь уже не напрямую зависит от подключения к базе данных, но скорее, интерфейс. С этим мы теперь можем обеспечить для целей тестирования a mock, stub, or fake.

Примером Подделка может быть:

public class MySomeInterfaceFake implements ISomeInterface { 
    @override 
    public string getInfo(int param1) { 
     if (param1 == 1) 
      return "TEST1"; 
     if (param1 == 2) 
      return "TEST2"; 
     if (param1 == 3) 
      return "TEST3"; 
    } 

Теперь с выше подделкой, вы передаете в поддельной реализации в конструкторе, и вы можете проверить myMethodThatNeedsTesting, не полагаясь на подключение к базе данных.

Вышеуказанный рефакторинг можно определить как dependency injection, и он весьма полезен для ослабленной связи, что приводит к более легкому тестированию кода, среди прочего.

Извините, если я испортил любой синтаксис в приведенном выше, снова Java не мой язык по выбору :)

0

Как упоминалось JSqlParser: Существует очень упрощенный пример оценки экспрессии. (https://github.com/JSQLParser/JSqlParser/wiki/Example-of-expression-evaluation)

Вы можете расширить это, чтобы построить интерпретатор, соответствующий вашим потребностям. Поскольку JSqlParser - это только парсер, это будет довольно сложной задачей.

Смежные вопросы