質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

1回答

12180閲覧

Java:DAOパターンの単体テストが上手くいかず、困っています

karakorum

総合スコア20

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2020/04/10 14:46

編集2020/04/10 16:23

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

Entity②

Account

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を再起動。
➡効果なし。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

>result.getAge()==23だけを条件として実行した場合、テストは成功しました。
とのことでStringはだめということは、
実行結果のminato の後にスペースなど入っていないですか?
デバックで取得した値は確認できますか?

投稿2020/04/10 15:42

junzi

総合スコア279

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

karakorum

2020/04/10 16:27

ご回答ありがとうございます。 ご指摘通り、String指定の文字の後ろに空白が入っていました。 テーブルを作るときに指定した文字数分の空白ですね。 全くの予想外でした。 上記DAOソースコードのselect文にtrimをつけて実行したら、無事、テストを成功することができました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問