解答例 - 実習課題1 - 3.テストクラス2
(実習課題1)
以下のクラスを作成する
- PostgresqlのTrainingデータベースのaccept_orderテーブルの検索を行うクラスを作成する
- まず、Junitを用いてクラスのテストクラスを作成し、その後に検索クラスを作成する。
- テストのソースなどをみれば、作成したクラスの仕様がわかるように工夫する
解答例
▼ディレクトリ構成例├─com │ └─techscore │ └─junit │ └─chapter3 │ └─exercise1 AcceptingOrder.class │ AcceptingOrderDAO.class │ AcceptingOrderDAOTest.class ├─lib▼受注データを管理するクラス
package com.techscore.junit.chapter3.exercise1; /** * AcceptingOrder.java * TECHSCORE JUnit3章 実習課題1 * * Copyright (c) 2004 Four-Dimensional Data, Inc. */ import java.sql.Date; public class AcceptingOrder { private String oNum; private String cNum; private String pNum; private int dcRate; private int optionPrice; private String employee; private Date acceptDate; public AcceptingOrder(){ } public AcceptingOrder(String oNum, String cNum, String pNum, int dcRate, int optionPrice, String employee, Date acceptDate ){ this.oNum = oNum; this.cNum = cNum; this.pNum = pNum; this.dcRate = dcRate; this.optionPrice = optionPrice; this.employee = employee; this.acceptDate = acceptDate; } public Date getAcceptDate() { return acceptDate; } public String getCNum() { return cNum; } public int getDcRate() { return dcRate; } public String getEmployee() { return employee; } public String getONum() { return oNum; } public int getOptionPrice() { return optionPrice; } public String getPNum() { return pNum; } public void setAcceptDate(Date date) { this.acceptDate = date; } public void setCNum(String string) { this.cNum = string; } public void setDcRate(int i) { this.dcRate = i; } public void setEmployee(String string) { this.employee = string; } public void setONum(String string) { this.oNum = string; } public void setOptionPrice(int i) { this.optionPrice = i; } public void setPNum(String string) { this.pNum = string; } }▼accept_order テーブルを検索するクラス
package com.techscore.junit.chapter3.exercise1; /** * AcceptingOrderDAO.java * TECHSCORE JUnit3章 実習課題1 * * Copyright (c) 2004 Four-Dimensional Data, Inc. */ import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.DriverManager; import java.util.LinkedList; import java.util.List; public class AcceptingOrderDAO{ public AcceptingOrderDAO(){ } private Connection getConnection() throws SQLException,ClassNotFoundException{ Connection conn = null; Class.forName("org.postgresql.Driver"); conn = DriverManager.getConnection("jdbc:postgresql://sasuke:5432/Training", "postgres",""); return conn; } public List loadSummary(String customerNumber) throws SQLException, ClassNotFoundException{ List list = new LinkedList(); Connection conn = null; try{ conn = getConnection(); final String sql = "select o_num, c_num, p_num, " + "dc_rate, option_price," + "employee, accept_date " + "from accept_order " + "where c_num = ?"; PreparedStatement statement = conn.prepareStatement(sql); statement.setString(1,customerNumber); ResultSet result = statement.executeQuery(); while (result.next()){ AcceptingOrder data = new AcceptingOrder( result.getString(1), result.getString(2), result.getString(3), result.getInt(4), result.getInt(5), result.getString(6), result.getDate(7)); list.add(data); } result.close(); statement.close(); }finally{ if (conn != null){ conn.close(); } } return list; } }▼accept_order テーブルを検索するクラスを単体デバッグするクラス
package com.techscore.junit.chapter3.exercise1; /** * AcceptingOrderDAOTest.java * TECHSCORE JUnit3章 実習課題1 * * Copyright (c) 2004 Four-Dimensional Data, Inc. */ import junit.framework.TestCase; import java.util.List; import java.util.Iterator; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class AcceptingOrderDAOTest extends TestCase{ private final static String LIST_NG_MESSAGE = "データベースの検索リスト異常"; private final static String ORDER_NUMBER_NG_MESSAGE = "受注番号の取得異常"; private final static String CUSTOMER_NUMBER_NG_MESSAGE = "顧客ナンバーの取得異常"; private final static String PRODUCT_NUMBER_NG_MESSAGE = "製品ナンバーの取得異常"; private final static String RATE_NG_MESSAGE = "製品の値引率の取得異常"; private final static String OPTION_PRICE_NG_MESSAGE = "オプションの価格の取得異常"; private final static String ACCEPT_DATE_NG_MESSAGE = "受注した日の取得異常"; private final static String EMPLOYEE_NG_MESSAGE = "従業員ナンバーの取得異常"; private final static String TEST_NG_MESSAGE = "例外が発生しテストが異常終了しました。"; private final static String sql = "select o_num, c_num, p_num, " + "dc_rate, option_price," + "employee, accept_date " + "from accept_order " + "where c_num = ?"; public AcceptingOrderDAOTest(String name){ super(name); } private Connection getConnection() throws ClassNotFoundException,SQLException{ Class.forName("org.postgresql.Driver"); Connection conn = DriverManager.getConnection("jdbc:postgresql://sasuke:5432/Training", "postgres",""); return conn; } public void testLoadSummary(){ String customerNumber = "1009"; AcceptingOrderDAO acceptingOrderDAO = new AcceptingOrderDAO(); Connection conn = null; try{ List list = acceptingOrderDAO.loadSummary(customerNumber); assertNotNull(LIST_NG_MESSAGE,list); conn = getConnection(); PreparedStatement statement = conn.prepareStatement(sql); statement.setString(1,customerNumber); ResultSet result = statement.executeQuery(); checkDetailData(list,result); result.close(); statement.close(); }catch(ClassNotFoundException e){ e.printStackTrace(); fail(TEST_NG_MESSAGE); }catch(SQLException e){ e.printStackTrace(); fail(TEST_NG_MESSAGE); }finally{ try{ if (conn != null){ conn.close(); } }catch(SQLException e){ e.printStackTrace(); } } } public void checkDetailData(List list,ResultSet result) throws SQLException{ Iterator iterator=list.iterator(); while(result.next()){ AcceptingOrder acceptingOrder = (AcceptingOrder)iterator.next(); assertEquals(ORDER_NUMBER_NG_MESSAGE,result.getString(1), acceptingOrder.getONum()); assertEquals(CUSTOMER_NUMBER_NG_MESSAGE,result.getString(2), acceptingOrder.getCNum()); assertEquals(PRODUCT_NUMBER_NG_MESSAGE,result.getString(3), acceptingOrder.getPNum()); assertEquals(RATE_NG_MESSAGE,new Integer(result.getInt(4)), new Integer(acceptingOrder.getDcRate())); assertEquals(OPTION_PRICE_NG_MESSAGE,new Integer(result.getInt(5)), new Integer(acceptingOrder.getOptionPrice())); assertEquals(ACCEPT_DATE_NG_MESSAGE,result.getString(6), acceptingOrder.getEmployee()); assertEquals(EMPLOYEE_NG_MESSAGE,result.getDate(7).toString(), acceptingOrder.getAcceptDate().toString()); AcceptingOrder order = new AcceptingOrder(result.getString(1),result.getString(2), result.getString(3),result.getInt(4), result.getInt(5),result.getString(6), result.getDate(7)); } assertFalse(LIST_NG_MESSAGE,iterator.hasNext()); } }▼accept_order テーブルの内容は以下のURLにあります。
http://www.4dd.co.jp/techscore/developing/tech/sql/db.html▼JUnit起動例
1.GUI版 # java junit.swingui.TestRunner com.techscore.junit.chapter3.exercise1.AcceptingOrderDAOTest 2.テキスト版 # java junit.textui.TestRunner com.techscore.junit.chapter3.exercise1.AcceptingOrderDAOTest いずれもカレントディレクトリは、com ディレクトリと同じ並びです。▼環境設定
1章の3節に記述されている$CLASSPATHの設定にpostgresql用のJDBCド ライバであるjarファイルのパスを加えてください。▼データベースの指定
解答例のソースでのデータベースとの接続で指定している内容は、以下の内容です。 postgresJDBCドライバ:org.postgresql.Driver サブプロトコル :postgresql ホスト名 :sasuke ポート番号 :5432 データベース名 :Training ユーザ名 :postgres