Eclipse+JSF+JPAで作るアプリ(7)―テストケースの実行
今回は前回作ったUserManagerのテストケースの作成です。
目的は、
- すぐに動くテストケースを実行できるようにする
- テストケースの実行時にテーブルを作成してしまう
です。
テーブルはそのままでは日本語が使えないためSQL Server Management Studio(SSMS)のスクリプト生成機能を使って再生成します。
Eclipseでのテストケース作成
作成方法を知らない人が読むとあまり思えないですが、初回だけ書きます。
テストしたいクラスを選び、[New]->[Other]からJUnitでフィルタし、JUnit Test Caseを選択します。
ソースフォルダをsrcからtestsrcに変え、そのままFinishを押します。Nextを押すとどのメソッドのテストを作るかが選べます。
テストケース
長くないため、例によってソースをそのまま貼り付けます。
CRUD操作をまとめたテストです。
package sample.yourlibrary.logic; import static org.junit.Assert.*; import java.util.List; import org.junit.After; import org.junit.Before; import org.junit.Test; import sample.yourlibrary.entity.User; public class UserManagerTest { @Before public void setUp() throws Exception { } @After public void tearDown() throws Exception { } @Test public void testCRUD() { //検索 List<User> list1st = UserManager.findAll(); int list1stSize = list1st.size(); //新規作成 User user1 = UserManager.createUser("user1", "user1name"); assertEquals("user1", user1.getAccount()); assertEquals("user1name", user1.getName()); //ID検索 User find1 = UserManager.findById(user1.getId()); assertEquals("user1", find1.getAccount()); assertEquals("user1name", find1.getName()); //更新 find1.setPassword("micky"); find1.setEmail("micky@destiney.land.hell"); find1.setIsAdmin(true); UserManager.updateUser(find1); //アカウント名検索 find1 = UserManager.findByAccount("user1"); assertEquals("user1", find1.getAccount()); assertEquals("user1name", find1.getName()); assertEquals("micky", find1.getPassword()); assertEquals("micky@destiney.land.hell", find1.getEmail()); assertTrue( find1.getIsAdmin() ); //ログイン User login = UserManager.login("user1", "micky" ); assertNotNull(login); assertEquals("user1name", login.getName()); //追加の件数確認 List<User> list2nd = UserManager.findAll(); assertEquals(list1stSize+1, list2nd.size() ); //削除 UserManager.removeUser(login); find1 = UserManager.findByAccount("user1"); assertNull( find1 ); //削除の件数確認 List<User> list3rd = UserManager.findAll(); assertEquals(list1stSize, list3rd.size() ); } }
テーブルの自動生成
persistent.xmlに以下の2行が記述してありました。
クラスのメタ情報をもとに、テーブルをcreateするという設定です。
database.actionには、drop-and-createといってテーブルを削除してから作成するモードもあります。
詳しくは、37.5 Database Schema Creation - Java Platform, Enterprise Edition: The Java EE Tutorial (Release 7)を参照ください。
<property name="javax.persistence.schema-generation.database.action" value="create" /> <property name="javax.persistence.schema-generation.create-source" value="metadata" />
テーブルの整形
自動生成されたテーブルは文字列長は255、varchar型なので国際化された文字列が格納できません。nvarcharに書き換えます。
外部キー、ユニークキーなどは作成してくれるのでとても便利です。
スクリプトはSSMSでテーブルを選択し、テーブルのスクリプト化メニューから「削除と作成」でテキストエディタに出力してから変更を加えます。外部キーが設定されていると削除、作成に順番が発生します。
また、SEQUENCEというテーブルができていることにも気づくはずです。これは、エンティティクラスの@Id 属性を自動生成するためのテーブルです。
全テーブルを生成するSQLを、私で整形したものを貼っておきますので、参考にしてください。
(使用者は主に私になるでしょうが)
SEQUENCEテーブルの削除と作成、外部キーの削除、LEND_HISTORY、USER、MOVIEテーブルの削除、USER、MOVIE、LEND_HISTORYテーブルの作成、外部キーの作成となっています。
USE [YourLibrary] GO /****** Object: Table [dbo].[SEQUENCE] Script Date: 2015/07/23 1:30:08 ******/ DROP TABLE [dbo].[SEQUENCE] GO /****** Object: Table [dbo].[SEQUENCE] Script Date: 2015/07/23 1:30:08 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[SEQUENCE]( [SEQ_NAME] [varchar](50) NOT NULL, [SEQ_COUNT] [numeric](28, 0) NULL, PRIMARY KEY CLUSTERED ( [SEQ_NAME] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO ALTER TABLE [dbo].[LEND_HISTORY] DROP CONSTRAINT [LEND_HISTORY_USER_ID] GO ALTER TABLE [dbo].[LEND_HISTORY] DROP CONSTRAINT [LEND_HISTORY_MOVIE_ID] GO /****** Object: Table [dbo].[LEND_HISTORY] Script Date: 2015/07/23 1:29:38 ******/ DROP TABLE [dbo].[LEND_HISTORY] GO /****** Object: Table [dbo].[LEND_HISTORY] Script Date: 2015/07/23 1:29:38 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO /****** Object: Table [dbo].[USERTBL] Script Date: 2015/07/23 1:30:38 ******/ DROP TABLE [dbo].[USERTBL] GO /****** Object: Table [dbo].[USERTBL] Script Date: 2015/07/23 1:30:38 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO /****** Object: Table [dbo].[MOVIE] Script Date: 2015/07/23 1:31:07 ******/ DROP TABLE [dbo].[MOVIE] GO /****** Object: Table [dbo].[MOVIE] Script Date: 2015/07/23 1:31:07 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[USERTBL]( [ID] [numeric](19, 0) NOT NULL, [ACCOUNT] [nvarchar](255) NOT NULL, [E_MAIL] [nvarchar](255) NULL, [IS_ADMIN] [bit] NULL, [NAME] [nvarchar](255) NOT NULL, [PASSWORD] [nvarchar](255) NULL, CONSTRAINT [PK__USERTBL__ID] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY], CONSTRAINT [UQ__USERTBL__ACCOUNT] UNIQUE NONCLUSTERED ( [ACCOUNT] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO ALTER TABLE [dbo].[USERTBL] ADD DEFAULT ((0)) FOR [IS_ADMIN] GO CREATE TABLE [dbo].[MOVIE]( [ID] [numeric](19, 0) NOT NULL, [CATEGORY] [nvarchar](400) NULL, [IS_LENT] [bit] NULL, [OUTLINE] [nvarchar](MAX) NULL, [TITLE] [nvarchar](400) NOT NULL, CONSTRAINT [PK__MOVIE__ID] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY], CONSTRAINT [UQ__MOVIE__TITLE] UNIQUE NONCLUSTERED ( [TITLE] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO CREATE TABLE [dbo].[LEND_HISTORY]( [ID] [numeric](19, 0) NOT NULL, [DUE_DATE] [datetime] NULL, [LEND_DATE] [datetime] NULL, [RETURN_DATE] [datetime] NULL, [REVIEW] [nvarchar](MAX) NULL, [STAR_RATING] [float] NULL, [USER_ID] [numeric](19, 0) NULL, [MOVIE_ID] [numeric](19, 0) NULL, CONSTRAINT [PK__LEND_HISTORY__ID] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO ALTER TABLE [dbo].[LEND_HISTORY] WITH CHECK ADD CONSTRAINT [LEND_HISTORY_MOVIE_ID] FOREIGN KEY([MOVIE_ID]) REFERENCES [dbo].[MOVIE] ([ID]) GO ALTER TABLE [dbo].[LEND_HISTORY] CHECK CONSTRAINT [LEND_HISTORY_MOVIE_ID] GO ALTER TABLE [dbo].[LEND_HISTORY] WITH CHECK ADD CONSTRAINT [LEND_HISTORY_USER_ID] FOREIGN KEY([USER_ID]) REFERENCES [dbo].[USERTBL] ([ID]) GO ALTER TABLE [dbo].[LEND_HISTORY] CHECK CONSTRAINT [LEND_HISTORY_USER_ID] GO