/*
* Copyright (c) 2007 NTT DATA Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package jp.terasoluna.fw.message;
import java.sql.ResultSet;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import javax.sql.DataSource;
import org.junit.After;
import org.junit.Test;
import org.springframework.test.util.ReflectionTestUtils;
import static org.mockito.Mockito.*;
import uk.org.lidalia.slf4jext.Level;
import uk.org.lidalia.slf4jtest.TestLogger;
import uk.org.lidalia.slf4jtest.TestLoggerFactory;
import static uk.org.lidalia.slf4jtest.LoggingEvent.warn;
import static uk.org.lidalia.slf4jtest.LoggingEvent.debug;
import static java.util.Arrays.asList;
import static org.hamcrest.core.Is.*;
import static org.junit.Assert.*;
/**
* {@link jp.terasoluna.fw.message.DBMessageQuery} クラスのブラックボックステスト。
* <p>
* <h4>【クラスの概要】</h4> メッセージリソースを取得するRDBMSオペレーションクラス
* <p>
* @see jp.terasoluna.fw.message.DBMessageQuery
*/
public class DBMessageQueryTest {
private TestLogger logger = TestLoggerFactory.getTestLogger(
DBMessageQuery.class);
/**
* テスト後処理:ロガーのクリアを行う。
*/
@After
public void tearDown() {
logger.clear();
}
/**
* testDBMessageDataSource01() <br>
* <br>
* (正常系) <br>
* 観点:A <br>
* <br>
* 入力値:(引数) ds:not null<br>
* (引数) sql:"SELECT CODE,MESSAGE FROM MESSAGES"<br>
* (引数) codeColumn:"CODE"<br>
* (引数) languageColumn:"LANGUAGE"<br>
* (引数) countryColumn:"COUNTRY"<br>
* (引数) variantColumn:"VARIANT"<br>
* (引数) messageColumn:"MESSAGE"<br>
* <br>
* 期待値:(状態変化) rsCodeColumn:"CODE"<br>
* (状態変化) rsLanguageColumn:"LANGUAGE"<br>
* (状態変化) rsCountryColumn:"COUNTRY"<br>
* (状態変化) rsVariantColumn:"VARIANT"<br>
* (状態変化) message:"MESSAGE"<br>
* (状態変化) compile():呼び出されたことを確認する。<br>
* <br>
* 引数がStringだった場合、引き渡された値が変化なく格納されるかを確認。 <br>
* @throws Exception このメソッドで発生した例外
*/
@Test
public void testDBMessageDataSource01() throws Exception {
// 前処理
DataSource ds = mock(DataSource.class);
DBMessageQuery db = new DBMessageQuery(ds, "SELECT CODE,MESSAGE FROM MESSAGES", "CODE", "LANGUAGE", "COUNTRY", "VARIANT", "MESSAGE");
// テスト実施
// 判定
assertEquals("CODE", ReflectionTestUtils.getField(db, "rsCodeColumn"));
assertEquals("LANGUAGE", ReflectionTestUtils.getField(db,
"rsLanguageColumn"));
assertEquals("COUNTRY", ReflectionTestUtils.getField(db,
"rsCountryColumn"));
assertEquals("VARIANT", ReflectionTestUtils.getField(db,
"rsVariantColumn"));
assertEquals("MESSAGE", ReflectionTestUtils.getField(db,
"rsMessageColumn"));
assertTrue(db.isCompiled());
}
/**
* testDBMessageDataSource02() <br>
* <br>
* (正常系) <br>
* 観点:A,C <br>
* <br>
* 入力値:(引数) ds:not null<br>
* (引数) sql:"SELECT CODE,MESSAGE FROM MESSAGES"<br>
* (引数) codeColumn:""<br>
* (引数) languageColumn:""<br>
* (引数) countryColumn:""<br>
* (引数) variantColumn:""<br>
* (引数) messageColumn:""<br>
* <br>
* 期待値:(状態変化) rsCodeColumn:""<br>
* (状態変化) rsLanguageColumn:""<br>
* (状態変化) rsCountryColumn:""<br>
* (状態変化) rsVariantColumn:""<br>
* (状態変化) message:""<br>
* (状態変化) compile():呼び出されたことを確認する。<br>
* <br>
* 引数が空文字だった場合、引き渡された値が変化なく格納されるかを確認。 <br>
* @throws Exception このメソッドで発生した例外
*/
@Test
public void testDBMessageDataSource02() throws Exception {
// 前処理
DataSource ds = mock(DataSource.class);
DBMessageQuery db = new DBMessageQuery(ds, "SELECT CODE,MESSAGE FROM MESSAGES", "", "", "", "", "");
// テスト実施
// 判定
assertEquals("", ReflectionTestUtils.getField(db, "rsCodeColumn"));
assertEquals("", ReflectionTestUtils.getField(db, "rsLanguageColumn"));
assertEquals("", ReflectionTestUtils.getField(db, "rsCountryColumn"));
assertEquals("", ReflectionTestUtils.getField(db, "rsVariantColumn"));
assertEquals("", ReflectionTestUtils.getField(db, "rsMessageColumn"));
assertTrue(db.isCompiled());
}
/**
* testDBMessageDataSource03() <br>
* <br>
* (正常系) <br>
* 観点:A,C <br>
* <br>
* 入力値:(引数) ds:not null<br>
* (引数) sql:"SELECT CODE,MESSAGE FROM MESSAGES"<br>
* (引数) codeColumn:null<br>
* (引数) languageColumn:null<br>
* (引数) countryColumn:null<br>
* (引数) variantColumn:null<br>
* (引数) messageColumn:null<br>
* <br>
* 期待値:(状態変化) rsCodeColumn:null<br>
* (状態変化) rsLanguageColumn:null<br>
* (状態変化) rsCountryColumn:null<br>
* (状態変化) rsVariantColumn:null<br>
* (状態変化) message:null<br>
* (状態変化) compile():呼び出されたことを確認する。<br>
* <br>
* 引数がnullだった場合、引き渡された値が変化なく格納されるかを確認。 <br>
* @throws Exception このメソッドで発生した例外
*/
@Test
public void testDBMessageDataSource03() throws Exception {
// 前処理
DataSource ds = mock(DataSource.class);
DBMessageQuery db = new DBMessageQuery(ds, "SELECT CODE,MESSAGE FROM MESSAGES", null, null, null, null, null);
// テスト実施
// 判定
assertNull(ReflectionTestUtils.getField(db, "rsCodeColumn"));
assertNull(ReflectionTestUtils.getField(db, "rsLanguageColumn"));
assertNull(ReflectionTestUtils.getField(db, "rsCountryColumn"));
assertNull(ReflectionTestUtils.getField(db, "rsVariantColumn"));
assertNull(ReflectionTestUtils.getField(db, "rsMessageColumn"));
assertTrue(db.isCompiled());
}
/**
* testMapRow01() <br>
* <br>
* (正常系) <br>
* 観点:A,E <br>
* <br>
* 入力値:(引数) rs:|"code"="test01"|"language"="ja"|"country"="JP" |"variant"="kaisai"|"message"="テストメッセージ01"|"hoge"="関係ないカラム"|
* <br>
* という内容のResultSet<br>
* (引数) rowNum:not null<br>
* <br>
* 期待値:(戻り値) DBMessage Bean:code->"test01"<br>
* language->"ja"<br>
* country->"JP"<br>
* variant->"kansai"<br>
* message->"テストメッセージ01"<br>
* <br>
* ResultSetのカラムの内容がStringであった場合、値の取得が出来るかの確認する。 また、要求していない"hoge"カラムがある場合、エラーにならずに無視するかを 確認する。<br>
* 取得したString文字列をそのままDBMessageBeanに格納する。 "hoge"カラムは無視され、どこにも影響しない。 <br>
* @throws Exception このメソッドで発生した例外
*/
@Test
public void testMapRow01() throws Exception {
// 前処理
DataSource ds = mock(DataSource.class);
DBMessageQuery db = new DBMessageQuery(ds, "SELECT CODE,MESSAGE FROM MESSAGES", "CODE", "LANGUAGE", "COUNTRY", "VARIANT", "MESSAGE");
int rowNum = 0;
db.rsCodeColumn = "code";
db.rsLanguageColumn = "language";
db.rsCountryColumn = "country";
db.rsVariantColumn = "variant";
db.rsMessageColumn = "message";
// 擬似ResultSetの設定
ResultSet rs = mock(ResultSet.class);
when(rs.getString("code")).thenReturn("test01");
when(rs.getString("language")).thenReturn("ja");
when(rs.getString("country")).thenReturn("JP");
when(rs.getString("variant")).thenReturn("kansai");
when(rs.getString("message")).thenReturn("テストメッセージ01");
rs.first();
// テスト実施
DBMessage dbmReturn = (DBMessage) db.mapRow(rs, rowNum);
// 判定
assertEquals("test01", dbmReturn.getCode());
assertEquals("ja", dbmReturn.getLanguage());
assertEquals("JP", dbmReturn.getCountry());
assertEquals("kansai", dbmReturn.getVariant());
assertEquals("テストメッセージ01", dbmReturn.getMessage());
}
/**
* testMapRow02() <br>
* <br>
* (正常系) <br>
* 観点:A,E <br>
* <br>
* 入力値:(引数) rs:|"code"=""|"language"=""|"country"=""|"variant"=""| "message"=""|"hoge"=""|<br>
* という内容のResultSet<br>
* (引数) rowNum:not null<br>
* <br>
* 期待値:(戻り値) DBMessage Bean:code->""<br>
* language->""<br>
* country->""<br>
* variant->""<br>
* message->""<br>
* <br>
* ResultSetのカラムの内容が空文字であった場合、値の取得が出来るかの確認する。 また、要求していない"hoge"カラムがある場合、エラーにならずに無視するかを 確認する。<br>
* 取得した空文字をそのままDBMessageBeanに格納する。"hoge"カラムは無視され、 どこにも影響しない。 <br>
* @throws Exception このメソッドで発生した例外
*/
@Test
public void testMapRow02() throws Exception {
// 前処理
DataSource ds = mock(DataSource.class);
DBMessageQuery db = new DBMessageQuery(ds, "SELECT CODE,MESSAGE FROM MESSAGES", "CODE", "LANGUAGE", "COUNTRY", "VARIANT", "MESSAGE");
int rowNum = 0;
db.rsCodeColumn = "code";
db.rsLanguageColumn = "language";
db.rsCountryColumn = "country";
db.rsVariantColumn = "variant";
db.rsMessageColumn = "message";
// 擬似ResultSetの設定
ResultSet rs = mock(ResultSet.class);
when(rs.getString("code")).thenReturn("");
when(rs.getString("language")).thenReturn("");
when(rs.getString("country")).thenReturn("");
when(rs.getString("variant")).thenReturn("");
when(rs.getString("message")).thenReturn("");
rs.first();
// テスト実施
DBMessage dbmReturn = (DBMessage) db.mapRow(rs, rowNum);
// 判定
assertEquals("", dbmReturn.getCode());
assertEquals("", dbmReturn.getLanguage());
assertEquals("", dbmReturn.getCountry());
assertEquals("", dbmReturn.getVariant());
assertEquals("", dbmReturn.getMessage());
}
/**
* testMapRowResultSetint03() <br>
* <br>
* (異常系) <br>
* 観点:A,E <br>
* <br>
* 入力値:(引数) rs:|"code"=null|"language"=null|"country"=null |"variant"=null|"message"=null|"hoge"=null|<br>
* という内容のResultSet<br>
* (引数) rowNum:not null<br>
* <br>
* 期待値:(戻り値) DBMessage Bean:code->""<br>
* language->""<br>
* country->""<br>
* variant->""<br>
* message->""<br>
* (状態変化) ログ:【警告ログ】<br>
* <メッセージ><br>
* "MessageCode is null"<br>
* <br>
* ResultSetのカラムの内容がnullであった場合、"hoge"カラムを除き、空文字に 変換してDBMessageBeanに格納する。またMessageCodeカラムの内容がnullで
* あった場合は、警告ログを出力する。"hoge"カラムは無視され、 どこにも影響しない。 <br>
* @throws Exception このメソッドで発生した例外
*/
@Test
public void testMapRowResultSetint03() throws Exception {
// 前処理
logger.setEnabledLevels(Level.WARN);
DataSource ds = mock(DataSource.class);
DBMessageQuery db = new DBMessageQuery(ds, "SELECT CODE,MESSAGE FROM MESSAGES", "CODE", "LANGUAGE", "COUNTRY", "VARIANT", "MESSAGE");
int rowNum = 0;
db.rsCodeColumn = "code";
db.rsLanguageColumn = "language";
db.rsCountryColumn = "country";
db.rsVariantColumn = "variant";
db.rsMessageColumn = "message";
// 擬似ResultSetの設定
ResultSet rs = mock(ResultSet.class);
when(rs.getString("code")).thenReturn(null);
when(rs.getString("language")).thenReturn(null);
when(rs.getString("country")).thenReturn(null);
when(rs.getString("variant")).thenReturn(null);
when(rs.getString("message")).thenReturn(null);
rs.first();
// 不要なログをクリア
logger.clear();
// テスト実施
logger.clear();
DBMessage dbmReturn = (DBMessage) db.mapRow(rs, rowNum);
// 判定
assertEquals("", dbmReturn.getCode());
assertEquals("", dbmReturn.getLanguage());
assertEquals("", dbmReturn.getCountry());
assertEquals("", dbmReturn.getVariant());
assertEquals("", dbmReturn.getMessage());
assertThat(logger.getLoggingEvents(), is(asList(warn(
"MessageCode is null"), debug(",,,,"))));
}
}