Java 有人做过FitNesse测试来查询真实的数据库吗?我能';t使Fitnesse连接成功

Java 有人做过FitNesse测试来查询真实的数据库吗?我能';t使Fitnesse连接成功,java,postgresql,fitnesse,Java,Postgresql,Fitnesse,我这样问是因为我在谷歌找到的所有例子都和Fitnesse教程中的一样:对内存中的列表或数组的非常简单的查询,而不是真正的数据库 是的,fixture永远不需要处理这个问题,但是如果我甚至不能在模拟“API”的过程中连接到DB,我该如何测试我的fixture呢 我试图模拟的是FitNesse Fixture调用Java查询PostgreSQL数据库/表。在这个简单的示例中,我试图从一个表中的一行中至少获取一列。当我执行代码时,它自己就可以完美地运行。问题是当试图通过夹具从Fitnesse执行时。调

我这样问是因为我在谷歌找到的所有例子都和Fitnesse教程中的一样:对内存中的列表或数组的非常简单的查询,而不是真正的数据库

是的,fixture永远不需要处理这个问题,但是如果我甚至不能在模拟“API”的过程中连接到DB,我该如何测试我的fixture呢

我试图模拟的是FitNesse Fixture调用Java查询PostgreSQL数据库/表。在这个简单的示例中,我试图从一个表中的一行中至少获取一列。当我执行代码时,它自己就可以完美地运行。问题是当试图通过夹具从Fitnesse执行时。调用JDBC驱动程序时,它总是失败,并出现ClassNotFoundException。这不是通过自己运行代码来实现的

以下是执行查询的代码:

package queriespackage;

import java.sql.*;

public class testQuery01 {

    public static Connection openDBConnection(){
        Connection connectionString = null;
        try {
            String dbhost = "SOMEURL";//Redacted
            String port = "SOMEPORT";//Redacted
            String dbname = "THEDBNAME";//Redacted
            String username = "SOMEUSER";//Redacted
            String password = "SOMEPASSWORD";//Redacted
            String driverJDBC = "org.postgresql.Driver";

            Class.forName(driverJDBC);
            connectionString = DriverManager.getConnection("jdbc:postgresql://" + dbhost + ":" + port + "/" + dbname,username,password);
            connectionString.setAutoCommit(false);
        } catch (SQLException e) {
            e.printStackTrace(System.err);
            System.exit(0);
        }  catch (Exception e) {
            System.err.println( e.getClass().getName()+": "+ e.getMessage() );
            System.exit(0);
        };
        return connectionString;
    };

    public static ResultSet executeQuery(Connection connectionString, int intAccountId) throws SQLException{

        Statement querySession = connectionString.createStatement();
        //The query string
        String queryString = "SELECT DISTINCT "
                + "account_search.account_id,"
                + "account_search.account_name"
                + " FROM account_search "
                + " WHERE"
                + " account_search.account_id = "+ intAccountId
                + "LIMIT 1";

        ResultSet queryResult = querySession.executeQuery(queryString);
        return queryResult; 
    };

    public static String processQueryResult(ResultSet queryResult) throws SQLException{
        String strQueryValueReturned = null;
        while (queryResult.next()) {
            strQueryValueReturned = queryResult.getString("account_name");
        };
        return strQueryValueReturned;       
    };

    public static boolean closeDBConnection(Connection connectionString){
        try {
            if(connectionString!=null){
                connectionString.close();
            }
        } catch (SQLException e) {
            System.err.println( e.getClass().getName()+": "+ e.getMessage() );
            System.exit(0);
        };
        return true;
    };

    public static String testQuery(int intAccountId) throws SQLException, ClassNotFoundException{
        boolean bolConnectionStatus = false;
        String strValueReturned = null;

        Connection connectionString = openDBConnection();

        if(connectionString != null){
            ResultSet qryQueryResult = executeQuery(connectionString, intAccountId);
            strValueReturned = processQueryResult(qryQueryResult);
            bolConnectionStatus = closeDBConnection(connectionString);
            if(!bolConnectionStatus){
                System.exit(0);
            }
        }else{
            System.exit(0);
        };
        return strValueReturned;
    };

};
如果我向代码中添加一个Main方法,并将“intaccounted”的参数值传递给它,它将成功地返回帐户名“account\u name”,正如预期的那样

下面是FitNesse测试应调用的夹具:

package fixturespackage;

import java.sql.SQLException;
import queriespackage.testQuery01;

public class testFixture01{

    private int Int_AccountId;

    //Fixture Constructor (setter)
    public testFixture01(int Int_AccountId){
        this.Int_AccountId = Int_AccountId;
    };  


    public String query() throws SQLException, ClassNotFoundException{
        return testQuery01.testQuery(Int_AccountId);
    };
};
正如FitNesse指南所说,必须有一个“查询”方法,它对数据库中的接口进行实际调用。我不得不添加一个构造函数而不是“setter”,因为FitNesse实际上要求它:“无法为fixturepackage.testFixture01调用构造函数”

以下是FitNesse页面:

!***> System Variables
!define TEST_SYSTEM {slim}
!path C:\FitnessTest\bin
*!

|Query: fixturespackage.testFixture01|21 |
|Str_AccountName                         |
|SomeName                                |
这是我的构建路径的屏幕截图,所以你可以看到我有用于Java8、JDK1.8、JRE1.8的JDBC库。。。“org.postgresql.Driver.class”包含在项目中

这是我从FitNesse运行时收到的错误:

这是我在使用Inspect tool调试FitNesse失败的线路时遇到的错误:

。。。是的,我也尝试过硬编码JDBC的名称:

我在这里搜索了很多关于现实生活的例子,《FitNesse指南》和谷歌

FitNesse指南可能内容广泛,但让我们真诚地说,它充满了“脏话”,不切实际和不完整的例子,并且遗漏了很多信息


那么,再问一次,有没有人使用FitNesse进行过真实的查询测试,这可以帮助我找出我做错了什么?

我必须承认,我只使用FitNesse进行了有限的数据库测试,但我使用了它们(查询DB2)。 我没有使用查询表(或编写自己的fixture进行查询),而是与脚本表和场景结合使用

无法找到驱动程序类这一事实表明,尽管jar存在于IDE的类路径上,但当FitNesse运行fixture代码时,它不可用

我注意到您将类路径指定为wiki中的单个目录。在Java中,这意味着所有类文件都应该位于该目录中(作为.class文件,位于其定义包的右子目录中)。它不会拾取该目录中的任何jar(或zip)。您是否将数据库驱动程序的jar解压缩到该目录?如果没有,您需要添加一个
!path
一行,用数据库驱动程序指向jar(因此整个路径包括文件名)

现在,列出您需要的每个jar可能很快变得麻烦,所以您也可以使用通配符。我倾向于将所有需要的JAR复制到一个目录中,该目录也包含fixture.class文件,并添加一个
!path
line加载该目录中的所有jar。 因此,如果您还将数据库驱动程序复制到您所问的目录中,您可以确保它和您自己的设备通过

!path C:\FitnessTest\bin
!path C:\FitnessTest\bin\*.jar

我必须承认,我只使用FitNesse进行了有限的数据库测试,但我使用了它们(查询DB2)。 我没有使用查询表(或编写自己的fixture进行查询),而是与脚本表和场景结合使用

无法找到驱动程序类这一事实表明,尽管jar存在于IDE的类路径上,但当FitNesse运行fixture代码时,它不可用

我注意到您将类路径指定为wiki中的单个目录。在Java中,这意味着所有类文件都应该位于该目录中(作为.class文件,位于其定义包的右子目录中)。它不会拾取该目录中的任何jar(或zip)。您是否将数据库驱动程序的jar解压缩到该目录?如果没有,您需要添加一个
!path
一行,用数据库驱动程序指向jar(因此整个路径包括文件名)

现在,列出您需要的每个jar可能很快变得麻烦,所以您也可以使用通配符。我倾向于将所有需要的JAR复制到一个目录中,该目录也包含fixture.class文件,并添加一个
!path
line加载该目录中的所有jar。 因此,如果您还将数据库驱动程序复制到您所问的目录中,您可以确保它和您自己的设备通过

!path C:\FitnessTest\bin
!path C:\FitnessTest\bin\*.jar

顺便说一句:屏幕截图引用了一个不同的包名,这是一个模拟名。真实的代码与我发布的代码相匹配。请将您的问题(及其标题)重新表述为“有人做过真实生活的测试吗?提出疑问”不是一个好问题(它是否与能够回答的“真实生活”无关)。你的问题应该集中在你的问题上,而不是某人是否能帮助你(如果他们能,他们会回答)。请参阅:。顺便说一句:屏幕截图引用了另一个包名,这是一个模拟名。真实的代码与我发布的代码相匹配。请将您的问题(及其标题)重新表述为“有人做过真实生活的测试吗?提出疑问”不是一个好问题(它是否与能够回答的“真实生活”无关)。你的问题应该集中在你的问题上,而不是某人是否能帮助你(如果他们能,他们会回答)。请看:。谢谢你,伙计!