Я хочу, чтобы выполнить выражение случая и получить данные .. Я пытаюсь с 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 не мой язык по выбору :)
Что вы пытаетесь достичь? Я не уверен, что понимаю, что означает «Выполнять sql без подключения к базе данных» означает ... какова ваша цель? – Kritner
Какие данные вы хотите запустить, если таковые имеются? Мне непонятно, чего вы хотите достичь, не могли бы вы уточнить? – JonasCz
Вы не можете выполнить SQL-запрос без базы данных SQL. Ничто не сможет обработать запрос. – Jehy