Eclipse+JSF+JPAで作るアプリ(7)―テストケースの実行

今回は前回作ったUserManagerのテストケースの作成です。

目的は、

  • すぐに動くテストケースを実行できるようにする
  • テストケースの実行時にテーブルを作成してしまう

です。

テーブルはそのままでは日本語が使えないためSQL Server Management Studio(SSMS)のスクリプト生成機能を使って再生成します。

Eclipseでのテストケース作成

作成方法を知らない人が読むとあまり思えないですが、初回だけ書きます。

テストしたいクラスを選び、[New]->[Other]からJUnitでフィルタし、JUnit Test Caseを選択します。
f:id:tshix:20150723010543p:plain

ソースフォルダをsrcからtestsrcに変え、そのままFinishを押します。Nextを押すとどのメソッドのテストを作るかが選べます。
f:id:tshix:20150723010559p:plain

テストケース

長くないため、例によってソースをそのまま貼り付けます。
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