Seasar DI Container with AOP

テスト技法Exerciseの解説

モックを作成するための設定に関する問題の解説

問題1

【解説】
インターフェースのモックを設定するには、org.seasar.framework.aop.interceptors.MockInterceptorを使用します。

1はトレース処理をCrosscutting Concernとして扱うためのInterceptorなので間違いです。
3は例外処理をCrosscutting concernとして扱うためのInterceptorなので間違いです。
4はメソッド呼び出しを別のコンポーネントに委譲するためのInterceptorなので間違いです。

<< 問題へ戻る
次の問題へ>>

問題2

【解説】
インターフェースのメソッドに戻り値をセットする場合、MockInterceptorの以下のメソッドを使用します。
第1引数でインターフェースのメソッド名を指定します。
第2引数で第1引数で指定したメソッドの返す値を指定します。

- public void setReturnValue(String methodName, Object returnValue)

以下のメソッドを指定すると、どのメソッドが呼ばれても同じ値を返します。
通常、1つのメソッドしか呼び出さないことが分かっている場合に使用します。
第1引数で返す値を指定します。

- public void setReturnValue(Object returnValue)

1はMockInterceptorにsetMock()メソッドはないので間違いです。
2はisInvoked()メソッドはインターフェースのメソッドが呼ばれたかどうかチェックするメソッドなので間違いです。
3はgetArgs()メソッドはインターフェースのメソッドの引数の値を取得するメソッドなので間違いです。

<< 問題へ戻る
次の問題へ>>

問題3

【解説】
isInvoked()はインターフェースのメソッドが呼ばれたかどうかを判定するメソッドです。

1,2,4.のような判定メソッドはありません。

<< 問題へ戻る
次の問題へ>>

モックの使用方法に関する問題の解説

問題1

【解説】
インターフェースのモックを作成するには、インターフェースに対して設定した MockInterceptorをアスペクトして使用します。

2はコンポーネントの構成に必要な値を設定することなので間違いです。
3はDAOとJavaBeansとの関連付けを行うことなので間違いです。
4は継承してもモックは作成されないので間違いです。

<< 問題へ戻る
次の問題へ>>

問題2

【解説】
特定のメソッドに対して戻り値を指定する場合、setReturnValue(String methodName, Object returnValue)を使用します。
diconファイルでは、initMethodタグのname属性にsetReturnValueを指定して1つ目のargタグでメソッド名、2つ目のargタグで
戻り値を指定します。

1は1つ目のargタグで引数まで記述してあるので間違いです。
3は2つ目のargタグで戻り値を指定してないので間違いです。この設定だと、setReturnValue(Object returnValue)を使用することになり、
つねに戻り値は文字列"showMessage"が返されます
4は1つ目のargタグに戻り値、2つ目のargタグでメソッド名を指定しているので間違いです。

<< 問題へ戻る
次の問題へ>>

問題3

【解説】
インターフェースのメソッドの引数の値を取得したい場合は以下のメソッドを使用します。
戻り値は呼び出されたメソッドの引数の値をObject[]として返すため、第1引数を取得したい場合は配列[0]を指定します。

- public Object[] getArgs(String methodName)

1はObjectの配列を指定していないので間違いです。
2は引数にクラス名を指定しているので間違いです。
3はgetReturnValue()メソッドはないので間違いです。

<< 問題へ戻る
次の問題へ>>

S2Unitの作成方法に関する問題の解説

問題1

【解説】
テストクラスを作成する場合、org.seasar.extension.unit.S2TestCaseを継承して作成します。

1.はJUnitを使用する場合に継承するクラスなので間違いです。
2.はS2UnitTestCaseは存在しないので間違いです。
3.はパッケージ名が違うので間違いです。

<< 問題へ戻る
次の問題へ>>

S2Containerの自動生成に関する問題の解説

問題1

【解説】
S2Containerは、テストメソッド(testXxx)ごとに生成されます。

2,3,4.では、自動的にS2Containerは生成されないので間違いです。

<< 問題へ戻る
次の問題へ>>

S2Containerに対するregister(),getComponent(),include()に関する問題の解説

問題1

【解説】
S2Unitでは、初期化(init)や終了処理(destroy)は内部で自動的に行われるため、destroy()は用意されていません。

1はオブジェクトやクラスなどをコンポーネント定義として登録するメソッドなので間違いです。
2はコンポーネントを取得するメソッドなので間違いです。
4はdiconファイルをインクルードするメソッドなので間違いです。

<< 問題へ戻る
次の問題へ>>

include時のPATHの省略に関する問題の解説

問題1

【解説】
include()を使用することでdiconファイルを読み込み、自身のコンテナに子供のコンテナとして登録します。

1はS2Unitには存在しないメソッドなので間違いです。
2はオブジェクトやクラスなどをコンポーネント定義として登録するメソッドなので間違いです。
4はS2Containerを作成するメソッドなので間違いです。

<< 問題へ戻る
次の問題へ>>

問題2

【解説】
include()するPATHがテストクラスと同じパッケージにある場合は、パッケージ部分のパスは省略できます。

1はファイルパスがaaa/hoge.diconになるので間違いです。
2は拡張子がついていないので間違いです。
3はファイルパスをコンマ(.)で区切ることはできないので間違いです。

<< 問題へ戻る
次の問題へ>>

変数の自動セットに関する問題の解説

問題1

【解説】
定義したコンポーネントの名前がテストクラスのフィールド名と一致しない場合、 コンポーネントのclass属性で指定したクラスのフィールドにセットします。

1,2,4はclass属性で判断され、自動的に変数に"Hello"がセットされます。

<< 問題へ戻る
次の問題へ>>

問題2

【解説】
テストクラスにstaticでなくfinalでもないフィールドが存在し、その名前からアンダースコア(_)を除いた名前のコンポーネントが
コンテナに存在すれば自動的にセットされます。
コンテナに自動セットさせたいコンポーネントが一つしかない場合は、変数名の規則はありません。

1は大文字と小文字の区別はされるので間違いです。
3は変数を初期化していると自動セットされないので間違いです。
4はstaticでなくfinalでもないフィールドではないといけないので間違いです。

<< 問題へ戻る
次の問題へ>>

setUpXxx(),tearDownXxx()メソッドに関する問題の解説

問題1

【解説】
テストメソッド(testXxx)に対応するsetUpXxx()を定義しておくと、setUp()の後に自動的に呼び出されます。
個別のテストメソッドごとの初期化を簡単に行えるようになります。

1,2はそのようなメソッドは定義されていないので間違いです。
4は"up"が"Up"でなければならないので間違いです。

<< 問題へ戻る
次の問題へ>>

問題2

【解説】
テストメソッド(testXxx)に対応するsetUpXxx()を定義しておくと、setUp()の後に自動的に呼び出されます。
個別のテストメソッドごとの初期化を簡単に行えるようになります。

2はpublicでなければならないので間違いです。
3は"Test"がメソッド名に含まれてしまっているので間違いです。
4は"hello"は"Hello"でなければならないので間違いです。

<< 問題へ戻る
次の問題へ>>

問題3

【解説】
テストメソッド(testXxx)に対応するtearDownXxx()を定義しておくと、tearDown()の前に自動的に呼び出されます。
個別のテストメソッドごとの終了処理を簡単に行えるようになります。

1,2はそのようなメソッドは定義されていないので間違いです。
4は"down"が"Down"でなければならないので間違いです。

<< 問題へ戻る
次の問題へ>>

問題4

【解説】
tearDownXxx()は、tearDown()の直前に実行されます。

<< 問題へ戻る
次の問題へ>>

トランザクション制御に関する問題の解説

問題1

【解説】
include("j2ee.dicon")をしておき、テストメソッド名の最後にTxをつける(testXxxTx)ことにより、 テストメソッドの直前にトランザクションを
開始し、テストメソッドの直後にトランザクションをロールバックするようになります。

2は"TX"が"Tx"でなければならないので間違いです。
3,4は"Tx"はメソッド名の最後につくので間違いです。

<< 問題へ戻る
次の問題へ>>

readXls()メソッドに関する問題の解説

問題1

【解説】
検証用のExcelデータを読み込む場合は、以下のメソッドを使用します。

- public DataSet readXls(String path)

2はDBからレコードを読み込み、DataTableを作成するメソッドなので間違いです。
3はDBからSQL文の実行結果を取得し、DataTableを作成するメソッドなので間違いです。
4はS2TestCaseに存在しないメソッドなので間違いです。

<< 問題へ戻る
次の問題へ>>

問題2

【解説】
パス指定をする場合、必ず拡張子を付ける必要があります。

1はExcelデータとテストクラスが同一パス上に存在する場合は、パスを省略することが可能です。
2はパス名を省略することが可能ですが、フルパスで指定しても正しく読み込みます。
3は相対パスで指定しても正しく読み込みます。

<< 問題へ戻る
次の問題へ>>

assertEquals()メソッドに関する問題の解説

問題1

【解説】
assertEquals()で予想されるDataSetの結果に対して、Map、MapのList、Bean、BeanのListと比較することができます。

<< 問題へ戻る
次の問題へ>>

問題2

【解説】
DataSetとListを比較する場合、以下のメソッドを使用します。

- public void assertEquals(DataSet expected, Object actual)
または
- public void assertEquals(String message, DataSet expected, Object actual)

1,2,4そのようなメソッドは定義されていないので間違いです。

<< 問題へ戻る
次の問題へ>>

reload()メソッドに関する問題の解説

問題1

【解説】
正しいメソッド定義は、引数がDataSet、戻り値がDataSetです。

1は戻り値がvoidなので間違いです。
2はDataTableに対応するDBのレコードを読み込み、DataTableを作成するメソッドなので間違いです。
3は引数に指定がないので間違いです。

<< 問題へ戻る
次の問題へ>>

問題2

【解説】
S2Unit機能では、プライマリーキーの検索,設定は自動で行うため、とくに指定する項目はありません。

<< 問題へ戻る
次の問題へ>>

readXlsWriteDb(),readXlsAllReplaceDb()メソッドに関する問題の解説

問題1

【解説】
ExcelデータをDBに登録する場合は、以下のメソッドを使用します。

- public void readXlsWriteDb(String path)

1はDataSetの内容から、Excelファイルを作成するメソッドなので間違いです。
3はDataSetをDBに登録するメソッドなので間違いです。
4はS2TestCaseに存在しないメソッドなので間違いです。

<< 問題へ戻る
次の問題へ>>

問題2

【解説】
Excelデータとテストクラスが同一パス上に存在しないので、フルパスで指定する必要があります。

1はフルパスで指定していないので間違いです。
2は拡張子を指定していないので間違いです。
3は検証用Excelのパスの指定が違っているので間違いです。

<< 問題へ戻る
次の問題へ>>

問題3

【解説】
readXlsAllReplaceDb()メソッドを用いる場合、外部キー制約に違反しないように、 データのないシートを用意する必要があります。
テーブルAのデータしか使わない場合でも、テーブルB用にシート名だけのシートを用意する必要があります。
シートの定義順序は、テーブルA、テーブルBの順になります。

1は外部キー制約に違反するので間違いです。
3はシートAが定義されてないので間違いです。
4はシートの定義順序が逆になっているので間違いです。


Excelファイルの作成に関する問題の解説

問題1

【解説】
検証用のExcelファイルを作成する場合は、シート名にはテーブル名、シートの1行目にはカラム名を記述します。

<< 問題へ戻る
次の問題へ>>

問題2

【解説】
SQLのSELECT文を条件にしてテーブルのデータの内容をDataSetに読み込ませる場合は以下のメソッドを使用します。

- public void addSql(String sql, String tableName)

2のreadSql()メソッドはないので間違いです。
3のaddTable()を使う場合は、テーブル名だけ指定して全件取得するか、テーブル名とSQL文のWHERE句の条件を指定して取得するので間違いです。
4のread()は読み込んだDateSetを返すので間違いです。

<< 問題へ戻る
次の問題へ>>

問題3

【解説】
org.seasar.extension.dataset.impl.XlsWriterクラスのコンストラクタで出力先のファイルパスを指定するのでコンストラクタ・インジェクションを使います。また同じ階層にExcelファイルがある場合は、パスを省略することが出来ます。

1のようにメソッド・インジェクションを使ってもコンストラクタにセットすることはできないので間違いです。
2はsetpath()というセッター・メソッドがないので間違いです。セッター・インジェクションを使ってコンストラクタにセットすることは出来ません。
3のwirte()メソッドは、コンストラクタで指定されたパスのExcelファイルにデータを出力するメソッドなので間違いです。

<< 問題へ戻る
次の問題へ>>

S2DaoTestCaseに関する問題の解説

問題1

【解説】
S2DaoTestCaseでは、JUnitを拡張したS2TestCaseを継承しているので、S2DaoのSELECT文の結果(Bean or BeanList)以外もテストできます。

<< 問題へ戻る
次の問題へ>>

問題2

【解説】
S2DaoTestCaseでは、COLUMNアノテーションがあるBeanを比較する場合、COLUMNアノテーションがあるプロパティ名をカラム名として Excelファイルと比較するので、シートの1行目にはカラム名を記述します。

<< 問題へ戻る