javaの基礎を"スッキリわかるサーブレット&JSP入門"で勉強中の初心者です。
●環境
・Java version :13.0.2
・IDE Eclipse Version: 2020-03 (4.15.0)
・アプリケーションサーバー Apache Tomcat 9.0
・jdk 13.0.2
・postgresql PostgreSQL 12.2, compiled by Visual C++ build 1914, 64-bit
●OS :windows10
###質問内容
DAOパターンの単体テストが上手くいかず、困っています。
2つのEntityクラス、DAO、DAOをテストするためのクラスの計4つのファイルを作成しました。やろうとしていることは、作成済みのpostgresqlのテーブルのデータをEntityクラスのインスタンスに入れ、DBの値と合っているかをテストすることです。
テスト①
AccountDAOTest.javaのAccounttestFindByLogin2メソッド
Entityに入れたテーブルの値が正しいかを確認する。
テスト②
AccountDAOTest.javaのAccounttestFindByLogin2メソッド
テーブルとは異なるパスワードを入れて、テーブルの値が取り出されないか、を確認する。
接続はうまくいき、コンソール画面にテーブルのデータを表示することもできます。
しかし、テスト①が上手くいきません。コンソール画面にDBの値が表示されているため、接続は正常にできており、値もEntityに入っていると考えられます。
しかし、テストが上手くいかず、理由がどうしても分かりません。
ソースコード、実行画面、試したこと等は、下記に記述しました。
もし原因が分かる方がいましたら、よろしくお願いします。
##捕捉
・postgresqlのドライバのビルドパスは通っています。
・今回、postgresqlのログインパスワードは適当に記述していますが、本来は正しいパスワードを使っています。
ソースコード
Entity①
Login
1package model; 2 3public class Login { 4 private String userId; 5 private String pass; 6 public Login (String userId,String pass) { 7 this.userId=userId; 8 this.pass=pass; 9 } 10 public String getUserId() {return this.userId;} 11 public String getPass() {return this.pass;} 12} 13
Entity②
Account
1package model; 2 3public class Account { 4 private String userId; 5 private String pass; 6 private String mail; 7 private String name; 8 private int age; 9 public Account (String userId,String pass,String mail,String name,int age) { 10 this.userId=userId; 11 this.pass=pass; 12 this.mail=mail; 13 this.name=name; 14 this.age=age; 15 } 16 public String getUserId() {return this.userId;} 17 public String getPass() {return this.pass;} 18 public String getMail() {return this.mail;} 19 public String getName() {return this.name;} 20 public int getAge() {return this.age;} 21}
DAO
AccountDAO
1package dao; 2 3import java.sql.Connection; 4import java.sql.DriverManager; 5import java.sql.PreparedStatement; 6import java.sql.ResultSet; 7import java.sql.SQLException; 8 9import model.Account; 10import model.Login; 11 12public class AccountDAO { 13 private final String JDBC_URL="jdbc:postgresql://localhost:5432/sukkirishop"; 14 private final String DB_USER="postgres"; 15 private final String DB_PASS="password"; 16 public Account findByLogin(Login login) { 17 Account account =null; 18 19 try(Connection conn=DriverManager.getConnection(JDBC_URL,DB_USER,DB_PASS)){ 20 //String sql="select * from account where user_id=? and pass=?"; 21 String sql="select trim(user_id)as user_id,rtrim(pass) as pass,rtrim(mail) as mail,rtrim(name) as name,age from account where user_id=? and pass=?"; 22 23 PreparedStatement pStmt=conn.prepareStatement(sql); 24 pStmt.setString(1,login.getUserId()); 25 pStmt.setString(2,login.getPass()); 26 27 ResultSet rs=pStmt.executeQuery(); 28 29 if(rs.next()) { 30 String userId=rs.getString("user_id"); 31 String pass=rs.getString("pass"); 32 String mail=rs.getString("mail"); 33 String name=rs.getString("name"); 34 int age=rs.getInt("age"); 35 account =new Account(userId,pass,mail,name,age); 36 } 37 }catch(SQLException e) { 38 e.printStackTrace(); 39 return null; 40 } 41 return account; 42 } 43} 44
DAOのテスト
AccountDAOTest
1package test; 2 3import dao.AccountDAO; 4import model.Account; 5import model.Login; 6 7public class AccountDAOTest { 8 public static void main(String[]args) { 9 testFindByLogin1(); 10 testFindByLogin2(); 11 } 12 public static void testFindByLogin1() { 13 Login login=new Login("minato","1234"); 14 AccountDAO dao=new AccountDAO(); 15 Account result=dao.findByLogin(login); 16 if(result != null&& 17 result.getUserId().equals("minato")&& 18 result.getPass().equals("1234")&& 19 result.getMail().equals("minato@sukkiri.com")&& 20 result.getName().equals("湊祐輔")&& 21 result.getAge()==23){ 22 System.out.println("testFindByLogin1;成功しました"); 23 }else { 24 System.out.println("testFindByLogin1:失敗しました"); 25 System.out.println(result.getUserId()); 26 System.out.println(result.getPass()); 27 System.out.println(result.getMail()); 28 System.out.println(result.getName()); 29 System.out.println(result.getAge()); 30 } 31 } 32 public static void testFindByLogin2() { 33 Login login=new Login("minato","12345"); 34 AccountDAO dao=new AccountDAO(); 35 Account result=dao.findByLogin(login); 36 if(result==null) { 37 System.out.println("testFindByLogin2;成功しました"); 38 }else { 39 System.out.println("testFindByLogin2:失敗しました"); 40 } 41 } 42}
postgresqlのAccountテーブル(横に長いため、分割して記述します。)
user_id ------------ minato pass ------------ 1234 mail -------------------------------------------------- minato@sukkiri.com name --------------------------------------------- 湊祐輔 age ----- 23
##実行結果
testFindByLogin1:失敗しました minato 1234 minato@sukkiri.com 湊祐輔 23 testFindByLogin2;成功しました
#試したこと
①テスト①の条件を減らす。
➡result.getAge()==23だけを条件として実行した場合、テストは成功しました。
しかし、その他の条件を加えたり、その他単体で実行すると、エラーがでます。
②コンソール画面にDBのテーブルの内容を表示(ソースコードに記述済)
➡実行できる。接続はできていることが分かった。
③書籍のサンプルコードをコピペで実行。
➡同じ結果になる。
④equalsの書き方がおかしいのでは?
➡いろいろ調べたが、文法的に間違いはない。
⑤postgresql、アプリケーションサーバー、eclipseを再起動。
➡効果なし。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/10 16:27