From d0d47cd7b61c4978be7fdf57b15aa285c4bd4ea2 Mon Sep 17 00:00:00 2001 From: Hideki Sugimoto Date: Wed, 12 Oct 2022 02:26:49 +0900 Subject: [PATCH] Added API to specify Mock action for SQL update/batch process --- .../jp/co/future/uroborosql/SqlAgentImpl.java | 9 +++++ .../future/uroborosql/context/SqlContext.java | 20 +++++++++++ .../uroborosql/context/SqlContextImpl.java | 26 ++++++++++++++ .../jp/co/future/uroborosql/SqlBatchTest.java | 34 ++++++++++++++++++- .../co/future/uroborosql/SqlUpdateTest.java | 23 ++++++++++++- 5 files changed, 110 insertions(+), 2 deletions(-) diff --git a/src/main/java/jp/co/future/uroborosql/SqlAgentImpl.java b/src/main/java/jp/co/future/uroborosql/SqlAgentImpl.java index 5410c2b5..c7631473 100644 --- a/src/main/java/jp/co/future/uroborosql/SqlAgentImpl.java +++ b/src/main/java/jp/co/future/uroborosql/SqlAgentImpl.java @@ -274,6 +274,11 @@ public List> query(final SqlContext sqlContext, final CaseFo */ @Override public int update(final SqlContext sqlContext) throws SQLException { + if (sqlContext.getUpdateMockAction() != null) { + LOG.debug("Performs Mock action of update process"); + return sqlContext.getUpdateMockAction().apply(sqlContext); + } + // パラメータログを出力する MDC.put(SUPPRESS_PARAMETER_LOG_OUTPUT, Boolean.FALSE.toString()); @@ -400,6 +405,10 @@ protected void afterUpdate(final SqlContext sqlContext) { */ @Override public int[] batch(final SqlContext sqlContext) throws SQLException { + if (sqlContext.getUpdateMockAction() != null) { + LOG.debug("Performs Mock action of batch process"); + return new int[] { sqlContext.getUpdateMockAction().apply(sqlContext) }; + } // バッチ処理の場合大量のログが出力されるため、パラメータログの出力を抑止する MDC.put(SUPPRESS_PARAMETER_LOG_OUTPUT, Boolean.TRUE.toString()); diff --git a/src/main/java/jp/co/future/uroborosql/context/SqlContext.java b/src/main/java/jp/co/future/uroborosql/context/SqlContext.java index 84be3cfb..f9cf6280 100644 --- a/src/main/java/jp/co/future/uroborosql/context/SqlContext.java +++ b/src/main/java/jp/co/future/uroborosql/context/SqlContext.java @@ -12,6 +12,7 @@ import java.sql.SQLException; import java.sql.SQLType; import java.util.Map; +import java.util.function.Function; import jp.co.future.uroborosql.enums.SqlKind; import jp.co.future.uroborosql.fluent.ProcedureFluent; @@ -287,4 +288,23 @@ default void addDefineColumnType(final int column, final SQLType type) { * @param generatedKeyValues 自動採番するキーカラム値の配列 */ void setGeneratedKeyValues(Object[] generatedKeyValues); + + /** + * 更新処理実行時に通常の更新SQL発行の代わりに疑似的に実行する処理を取得する.
+ * デフォルト実装はnull を返却する. 必要に応じて子クラスでオーバーライドすること. + * + * @return 通常の更新SQL発行の代わりに行う疑似動作. null が返る場合は通常の更新処理を行う. + */ + default Function getUpdateMockAction() { + return null; + } + + /** + * 更新処理実行時に通常の更新SQL発行の代わりに疑似的に実行する処理を設定する. + * + * @param updateMockAction 通常の更新SQL発行の代わりに行う疑似動作. null を設定した場合は通常の更新処理を行う. + * @return 自身のSqlContext + */ + SqlContext setUpdateMockAction(Function updateMockAction); + } \ No newline at end of file diff --git a/src/main/java/jp/co/future/uroborosql/context/SqlContextImpl.java b/src/main/java/jp/co/future/uroborosql/context/SqlContextImpl.java index c13bad8a..b565856b 100644 --- a/src/main/java/jp/co/future/uroborosql/context/SqlContextImpl.java +++ b/src/main/java/jp/co/future/uroborosql/context/SqlContextImpl.java @@ -25,6 +25,7 @@ import java.util.Objects; import java.util.Set; import java.util.function.Consumer; +import java.util.function.Function; import java.util.function.Supplier; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -163,8 +164,12 @@ public boolean contains(final Object o) { /** パラメータ変換マネージャ */ private BindParameterMapperManager parameterMapperManager; + /** パラメータ名Set */ private ParameterNames parameterNames; + /** 更新処理実行時に通常の更新SQL発行の代わりに疑似的に実行する処理. */ + private Function updateMockAction; + /** * コンストラクタ。 */ @@ -1229,4 +1234,25 @@ public boolean hasGeneratedKeyColumns() { return getGeneratedKeyColumns() != null && getGeneratedKeyColumns().length > 0; } + /** + * {@inheritDoc} + * + * @see jp.co.future.uroborosql.context.SqlContext#getUpdateMockAction() + */ + @Override + public Function getUpdateMockAction() { + return this.updateMockAction; + } + + /** + * {@inheritDoc} + * + * @see jp.co.future.uroborosql.context.SqlContext#setUpdateMockAction(java.util.function.Function) + */ + @Override + public SqlContext setUpdateMockAction(Function updateMockAction) { + this.updateMockAction = updateMockAction; + return this; + } + } diff --git a/src/test/java/jp/co/future/uroborosql/SqlBatchTest.java b/src/test/java/jp/co/future/uroborosql/SqlBatchTest.java index 2e05084d..184211cc 100644 --- a/src/test/java/jp/co/future/uroborosql/SqlBatchTest.java +++ b/src/test/java/jp/co/future/uroborosql/SqlBatchTest.java @@ -1,6 +1,9 @@ package jp.co.future.uroborosql; -import static org.junit.Assert.*; +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.fail; import java.math.BigDecimal; import java.nio.file.Paths; @@ -19,6 +22,7 @@ import jp.co.future.uroborosql.context.SqlContext; import jp.co.future.uroborosql.converter.MapResultSetConverter; import jp.co.future.uroborosql.exception.UroborosqlRuntimeException; +import jp.co.future.uroborosql.fluent.SqlBatch; import jp.co.future.uroborosql.utils.CaseFormat; public class SqlBatchTest extends AbstractDbTest { @@ -376,4 +380,32 @@ public void testNotFoundFile() throws Exception { } } + /** + * updateMockActionが指定された場合のテストケース。 + */ + @Test + public void testUpdateMockAction() throws Exception { + Timestamp currentDatetime = Timestamp.valueOf("2005-12-12 10:10:10.000000000"); + List> rows = new ArrayList<>(); + for (int i = 1; i <= 1000; i++) { + Map row = new HashMap<>(); + row.put("product_id", i); + row.put("product_name", "商品名" + i); + row.put("product_kana_name", "ショウヒンメイ" + i); + row.put("jan_code", "1234567890124"); + row.put("product_description", i + "番目の商品"); + row.put("ins_datetime", currentDatetime); + row.put("upd_datetime", currentDatetime); + row.put("version_no", 1); + rows.add(row); + } + // 処理実行 + SqlBatch batch = agent.batch("example/insert_product") + .paramStream(rows.stream()); + SqlContext ctx = batch.context(); + ctx.setUpdateMockAction(context -> 2); + + assertThat(batch.count(), is(4)); + } + } \ No newline at end of file diff --git a/src/test/java/jp/co/future/uroborosql/SqlUpdateTest.java b/src/test/java/jp/co/future/uroborosql/SqlUpdateTest.java index ea880658..d85ed80e 100644 --- a/src/test/java/jp/co/future/uroborosql/SqlUpdateTest.java +++ b/src/test/java/jp/co/future/uroborosql/SqlUpdateTest.java @@ -1,6 +1,10 @@ package jp.co.future.uroborosql; -import static org.junit.Assert.*; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.fail; import java.math.BigDecimal; import java.nio.file.Paths; @@ -16,6 +20,7 @@ import jp.co.future.uroborosql.context.SqlContext; import jp.co.future.uroborosql.converter.MapResultSetConverter; import jp.co.future.uroborosql.exception.UroborosqlRuntimeException; +import jp.co.future.uroborosql.fluent.SqlUpdate; import jp.co.future.uroborosql.utils.CaseFormat; public class SqlUpdateTest extends AbstractDbTest { @@ -106,4 +111,20 @@ public void testNotFoundFile() throws Exception { fail(e.getMessage()); } } + + /** + * updateMockActionが指定された場合のテストケース。 + */ + @Test + public void testUpdateMockAction() throws Exception { + SqlUpdate update = agent.update("example/selectinsert_product") + .param("product_id", new BigDecimal("0"), JDBCType.DECIMAL) + .param("jan_code", "1234567890123", Types.CHAR); + SqlContext ctx = update.context(); + ctx.setUpdateMockAction(context -> 2); + + assertThat(update.count(), is(2)); + + } + } \ No newline at end of file