nablarch.test.core.standalone.TestShot Maven / Gradle / Ivy
package nablarch.test.core.standalone;
import static nablarch.core.util.Builder.concat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import nablarch.core.log.Logger;
import nablarch.core.log.LoggerManager;
import nablarch.core.util.StringUtil;
import nablarch.core.util.annotation.Published;
import nablarch.fw.ExecutionContext;
import nablarch.fw.launcher.CommandLine;
import nablarch.fw.launcher.Main;
import nablarch.test.NablarchTestUtils;
import nablarch.test.core.db.DbAccessTestSupport;
import nablarch.test.core.log.LogVerifier;
import nablarch.test.core.messaging.RequestTestingMessagingProvider.RequestTestingMessagingContext;
import nablarch.test.core.messaging.RequestTestingMessagingClient;
import nablarch.test.core.util.MapCollector;
/**
* @author T.Kawasaki
*/
@Published
public class TestShot {
/** ロガー */
private static final Logger LOGGER = LoggerManager.get(TestShot.class);
/** データベースサポートクラス */
private final DbAccessTestSupport dbSupport;
/** テストデータのシート名 */
private final String sheetName;
/** このショットが使用するテストデータ */
private final Map testData;
/** 前準備、結果検証を行うクラス */
private final TestShotAround around;
/** 実際のステータスコード */
private int actualStatusCode = Integer.MIN_VALUE;
/** テストクラス */
private Class> testClass;
/**
* コンストラクタ。
*
* @param sheetName シート名
* @param testData テストデータ
* @param dbSupport DBサポートクラス
* @param around 前準備、結果検証を行うクラス
* @param testClass テストクラス
*/
public TestShot(String sheetName, Map testData,
DbAccessTestSupport dbSupport, TestShotAround around, Class> testClass) {
this.dbSupport = dbSupport;
this.sheetName = sheetName;
this.testData = testData;
this.around = around;
this.testClass = testClass;
}
/** テストショットを実行する。 */
public final void executeTestShot() {
// 必須項目の存在チェック
NablarchTestUtils.assertContainsRequiredKeys(
"sheet=[" + sheetName + "]", testData, getRequiredColumns());
clearPreviousTestData();
String caseDesc = concat("test case. no=[", getNo(), "] case=[", getCaseName(), "]");
LOGGER.logDebug("START " + caseDesc);
// 準備
setUp();
// 実行
Main main = around.createMain();
actualStatusCode = invokeTarget(main);
// 結果検証
assertAll();
LOGGER.logDebug("END " + caseDesc);
}
/** テストで使用するデータのキャッシュをクリアする */
protected void clearPreviousTestData() {
// メッセージ同期送信で使用する要求電文のキャッシュをクリアする
RequestTestingMessagingClient.clearSendingMessageCache();
RequestTestingMessagingContext.clearSendingMessageCache();
LogVerifier.clear();
}
/**
* 必須カラム一覧を取得する。
*
* @return 必須カラム一覧
*/
protected Set getRequiredColumns() {
return REQUIRED_COLUMNS;
}
/**
* テスト対象を起動する。
*
* @param main 起動するメインクラス
* @return ステータスコード
*/
private int invokeTarget(Main main) {
CommandLine cmd = createCommandLine();
LOGGER.logDebug("Invoking test target. ");
LOGGER.logDebug("\trequest path =[" + cmd.getRequestPath() + "]");
LOGGER.logDebug("\tcommand line arguments=" + cmd.getArgs());
LOGGER.logDebug("\tcommand line options=" + cmd.getParamMap());
return main.handle(cmd, new ExecutionContext());
}
/** アサートを実行する。 */
private void assertAll() {
String msgOnFail = concat("no=[", getNo(), "] case=[", getCaseName(), "] ");
// ステータスコード確認
String statusMsg = around.compareStatus(actualStatusCode, this);
msgOnFail += statusMsg;
assertTables(msgOnFail); // DB確認
around.assertOutputData(msgOnFail, this); // 出力ファイル確認
assertMessages(); // メッセージ確認
LogVerifier.verify(msgOnFail); // ログ確認
if (StringUtil.hasValue(statusMsg)) {
throw new AssertionError(statusMsg);
}
}
/** 準備を行う。 */
private void setUp() {
setUpTable(); // DB
around.setUpInputData(this); // 入力ファイル
setUpExpectedLog(); // 出力ファイル
setUpMessage(); // 要求電文(期待値)
}
/** データベースの準備を行う。 */
private void setUpTable() {
String gid = testData.get(SETUP_TABLE);
if (StringUtil.isNullOrEmpty(gid)) {
return; // 空欄の場合、何もしない
}
// デフォルトのセットアップ
dbSupport.setUpDb(sheetName, null);
if (!gid.equals(DEFAULT_GID)) {
// グループID指定のセットアップ
dbSupport.setUpDb(sheetName, gid);
}
}
/** メッセージ同期送信で送信されたメッセージのアサートを行う */
private void assertMessages() {
RequestTestingMessagingClient.assertSendingMessage(testClass, sheetName, get("no"), get("expectedMessageByClient"));
RequestTestingMessagingContext.assertSendingMessage(testClass, sheetName, get("no"), get("expectedMessage"));
}
/** 期待するログメッセージの準備を行う。 */
private void setUpExpectedLog() {
String id = testData.get(EXPECTED_LOG);
if (StringUtil.isNullOrEmpty(id)) {
return; // 指定がない場合は何もしない。
}
List
© 2015 - 2025 Weber Informatics LLC | Privacy Policy