我们可以在java中没有真正的数据库连接的情况下执行SQL吗? 例如:
select IQID, NAME from TABLE_FILES where...
我将在java代码中替换运行时的param。 有没有办法做到这一点?
我找到了这个链接:How do I extract selected columns given an Oracle SQL String?
但此链接中未提供快速解决方案
目前正在考虑:虚拟hsqldb连接并执行SQL查询。但它需要跨越一个新的内存db。
有没有更好的&快速解决方案?
答案 0 :(得分:0)
我想执行case表达式并获取数据..我正在尝试使用JSQLParser。以上示例应返回" Test1"作为输出
但为什么你想这样做?您打算对您的查询进行单元测试吗?或调用查询的代码?
如果您正在尝试对数据库对象进行单元测试,那么最好将其放入proc并使用数据库单元测试框架。 Some info on oracle unit testing。我假设基于双重的oracle。
如果您正在尝试测试Java代码,则需要考虑直接从您尝试测试的方法中提取查询,并编程到您可以提供的接口&# 34;实"实现,以及模拟或虚假实现。这样您就可以独立于db调用本身进行测试。
我在代码中的意思的一个例子,抱歉这会有点粗糙,因为我对java不太熟悉与c#
相比说你有:
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?
}
}
所以,如上所述,如果您的目的是测试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不是我选择的语言:)
答案 1 :(得分:0)
正如您提到的JSqlParser:表达式评估有一个非常简单的例子。 (https://github.com/JSQLParser/JSqlParser/wiki/Example-of-expression-evaluation)
您可以扩展它以构建适合您需求的解释器。由于JSqlParser只是一个解析器,这将是一项非常重要的任务。