Ich will Fall Ausdruck auszuführen und Daten zu erhalten .. Ich mit JSQLParser versuchen. Im obigen Beispiel sollte „Test1“ Rückkehr als Ausgang
aber warum versuchen Sie, das zu tun? Möchten Sie Ihre Abfrage testen? oder der Code, der die Abfrage aufruft?
Wenn Sie versuchen, Datenbankobjekte in einem Unit-Test zu testen, ist es besser, sie in einen Proc zu schreiben und ein Framework zum Testen von Datenbankeinheiten zu verwenden. Some info on oracle unit testing. Ich nehme an, dass Orakel auf Dual basiert.
Wenn Sie versuchen, Ihren Java-Code zu testen, müssen Sie darüber nachdenken, die Abfrage direkt aus der Methode, die Sie testen möchten, zu ziehen und auf eine Schnittstelle zu programmieren, auf die Sie "echte" Implementierung bereitstellen können. und eine falsche oder falsche Implementierung. Auf diese Weise testen Sie unabhängig vom db-Aufruf selbst.
Ein Beispiel dessen, was ich in Code bedeuten, und sorry das wird ein wenig rau sein, wie ich bin weniger vertraut mit Java im Vergleich zu C#
Sie zu sagen haben:
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 , wie oben erwähnt, wenn Sie die SQL selbst testen möchten, sollten Sie wahrscheinlich das SQL-Literal herausziehen, es in eine gespeicherte Prozedur einfügen und ein Unit-Test-Framework verwenden, um das Ergebnis des Proc unter mehreren Szenarien wie param value = zu testen 1, 2 und 3.
Aber, wenn Sie die Umgebung // Do stuff
und/oder // potentially do some other stuff?
testen möchten, ohne von der Datenbankkonnektivität abhängig zu sein, müssen Sie ein relativ einfaches Refactoring durchführen.
Die Methode hat eine Abhängigkeit von der Datenbank, die wir über eine Schnittstelle abstrahieren müssen, um die Methode testen zu können, ohne auf eine echte Datenbankverbindung angewiesen zu sein.
die etwa wie folgt aussehen könnte:
public interface ISomeInterface {
string getInfo(int param1);
}
Ich habe die oben sein eine Darstellung dessen, was die Abfrage darstellt definiert.Die Abfrage erfordert einen Parameter (param1) und gibt eine skalare Zeichenfolge zurück (Ergebnis aus Ihrer Abfrage).
diese Schnittstelle gegeben, können Sie Ihre ursprüngliche Klasse Refactoring mehr wie folgt aussehen:
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?
}
}
In der oben können Sie sehen, dass die Methode myMethodThatNeedsTesting
jetzt nicht mehr auf eine Datenbankverbindung direkt abhängig, aber eher eine Schnittstelle. Damit können wir nun zu Testzwecken a mock, stub, or fake bereitstellen.
könnte ein Beispiel gefälscht sein:
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";
}
Jetzt mit der oben Fälschung, Sie in der falschen Umsetzung in Ihrem Konstruktor übergeben, und Sie können myMethodThatNeedsTesting
testen auf einer Datenbank-Verbindung, ohne sie.
Der obige Refactor kann als dependency injection definiert werden, und ist sehr nützlich für lose Kopplung, die unter anderem zu leichter zu testenden Code führt.
Sorry, wenn ich irgendwelche Syntax in der oben vermasselt, wieder Java ist nicht meine Sprache der Wahl :)
Was versuchen Sie zu erreichen? Ich bin mir nicht sicher, ob ich verstehe, was "SQL ohne Datenbankverbindung ausführen" bedeutet ... was ist Ihr Ziel? – Kritner
Für welche Art von Daten müssen Sie Ihre Abfrage ggf. ausführen? Es ist mir nicht klar, was du damit erreichen willst, könntest du das klären? – JonasCz
Sie können keine SQL-Abfrage ohne SQL-Datenbank ausführen. Nichts kann die Abfrage verarbeiten. – Jehy