0

データベースのバックエンドに接続されている小さなJavaプロジェクトがあります。ログイン機能がありますが、テストハーネスに入れると、正しい出力を返すことができません。

public boolean validateLogin(User validate) {
        {
            Connection conn = null;

            String dbUserName = "root"; // MySQL database username
            String dbPassword = "nbuser"; // MySQL database password


            boolean returnValue = false;

            String dbUrl = "jdbc:mysql://localhost:3306/project";

            try {
                Class forNam = Class.forName("com.mysql.jdbc.Driver");

                try {

                    forNam.newInstance();
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                }
            } catch (ClassNotFoundException ex) {
            }

            try {

                conn = DriverManager.getConnection(dbUrl, dbUserName, dbPassword);
                System.out.println("Database connection establish...!");

                Statement st = conn.createStatement();
                ResultSet rs = st.executeQuery("SELECT * FROM login_register WHERE user_id='" + validate.getUserID() + "'");
                if (rs.next()) {
                    if (rs.getString(2).equals(validate.getUserPassword())) {
                        System.out.println("User and Password Match");
                    } else {
                        System.out.println("No User Or Password Match");
                    }
                } 
                else {
                    System.out.println("No User Or Password Match");
                }

            } catch (SQLException ex) {
                System.out.println("Cannot connect to database server...!!");

            } finally {
                if (conn != null) {
                    try {

                        conn.close();
                        System.out.println("Database connection terminated...!!!");
                        returnValue = true;
                    } catch (SQLException ex) {
                    }
                }
            }
            return returnValue;

        }
    }

次に、このステートメントが機能するかどうかを確認するためのテストコード

User testLogin = new User();
testLogin.setUserID("userid");
testLogin.setUserPassword("password");
 if (test.validateLogin(testLogin)) {
    System.out.println("User logged in");
} 
 else {
    System.out.println("Failed to login");
}

上記の2ビットの情報はデータベースにあるため、IDEでの出力は次のようになります。

Database connection establish...!
User and Password Match
Database connection terminated...!!!
User logged in

しかし、値をデータベースにないものに変更すると、

Database connection establish...!
No User Or Password Match
Database connection terminated...!!!
User logged in

そのため、値が一致しない場合のテストコードに問題があります。値が一致しないとは言えません。これは、後の作業で関数に必要です。"failed to login"IDとパスワードがテスト側で一致しないかどうかを判断するために、テストコードで何を変更する必要があるかについてのアイデア

4

4 に答える 4

1

これを試して

if (rs.getString(2).equals(validate.getUserPassword())) {
        System.out.println("User and Password Match");
        returnValue =true;
                    } else {
        System.out.println("No User Or Password Match");
         returnValue =false;
                    }

returnValue =true;そしてfinallyブロックから削除します

于 2013-03-06T10:53:39.187 に答える
1

あなたの方法にはいくつかの問題があります:

  1. コードを1つのtry/catchブロックに配置する必要があります。配置方法では、最初のtryブロックのコードClass forNam = Class.forName("com.mysql.jdbc.Driver");が失敗した場合でも、2番目のコードが実行されるため、接続を開くことができないために例外が発生します。

  2. finally()ブロックは、メソッドが常にtrueを返すことを確認します。「ユーザーとパスワードの一致」シナリオとともに、returnValue = true;ピースをブロック内に配置する必要があります。if (rs.getString(2).equals(validate.getUserPassword())) {

于 2013-03-06T10:56:28.907 に答える
0

これはあなたが問題を抱えている部分です:

        } finally {
            if (conn != null) {
                try {

                    conn.close();
                    System.out.println("Database connection terminated...!!!");
                    //delete the next line:
                    //returnValue = true; // <-- in a finally block, this will always run...

また、必要なときにreturnValueをtrueに設定しないことに気づきました。

            if (rs.next()) {
                if (rs.getString(2).equals(validate.getUserPassword())) {
                    System.out.println("User and Password Match");
                    //add this line:                         
                    returnValue=true;
                } else {
                    System.out.println("No User Or Password Match");
                }
            } 
            else {
                System.out.println("No User Or Password Match");
            }
于 2013-03-06T10:52:08.043 に答える
0

成功状態は「データベースに接続できますか」に依存しませんが、パスワードが一致する場合は設定する必要があります...

            if (rs.next()) {
                if (rs.getString(2).equals(validate.getUserPassword())) {
                    System.out.println("User and Password Match");
                    returnValue = true; // <---
                } else {
                    System.out.println("No User Or Password Match");
                }
            } 
            else {
                System.out.println("No User Or Password Match");
            }

finally句で値をtrueに設定しないでください。

于 2013-03-06T10:55:35.313 に答える