質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
JUnit

JUnitは、Javaで開発されたプログラムのユニットテストを行うためのアプリケーションフレームワークです。簡単にプログラムのユニットテストを自動化することができ、結果もわかりやすく表示されるため効率的に開発時間を短縮できます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

7296閲覧

dbunit(JUnit)での現在時刻をinsertする処理のAssert

maruhachi

総合スコア26

JUnit

JUnitは、Javaで開発されたプログラムのユニットテストを行うためのアプリケーションフレームワークです。簡単にプログラムのユニットテストを自動化することができ、結果もわかりやすく表示されるため効率的に開発時間を短縮できます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/05/12 07:48

編集2017/05/12 07:49

dbunitというDAOのテストをサポートするライブラリを用いてのJUnitでの質問です。

作成したDAOのメソッドとして現在時刻(Current_timestamp)をinsertの値に用いるものがあります。
Assertの仕方として、「正しく現在時刻が入ったこと」をチェックしたいとした時、どのようにAssertを仕組めばよいでしょうか。

自分の浅い知識で思いつくのは

  • ①insert実行前の時刻を保存
  • ②テスト対象メソッド実行(insert)
  • ③実行後の時刻を保存

という順に流し、2の時刻がこの1,3の時刻の間であること、程度しか思いつきません。
ただこれですとかなりdbunitから外れたコードを書かなければならなく、辛いです。

なにか、他に良いチェックの方法、または考え方(そもそも論)は有りますでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

対象のメソッドがどのような実装か分からないので、なんとも言えないところはありますが、

  • Mockを使って現在時刻を任意の時刻にする。
  • このメソッドは修正されないことを期待して、assertしない。(手動確認)

DBに任意の値が登録されることを確認したいのか、
現在時刻であること確認したいのか切り分けるといいかと思います。

投稿2017/05/12 08:43

szk.

総合スコア1400

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maruhachi

2017/05/20 03:36

ありがとうございます、まずはおっしゃる通りMockの適用が考えられますね。 現在時刻以外の、おかしな日付が入っていないかをチェックしたいところなので、Mock以外のアサーションの手段を考えてみたいと思います。
guest

0

多くの DB の場合、トランザクションをかけている場合は current_timestamp は「トランザクションを開始した時刻」で固定されるはずです。
ですので、
0. トランザクション開始
0. current_timestamp 取得
0. current_timestamp で insert
0. insert したレコードを取得して、current_timestamp が一致しているか判定

くらいですかねえ。

投稿2017/05/12 07:55

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KiyoshiMotoki

2017/05/12 08:52

横から失礼します。 > 多くの DB の場合、トランザクションをかけている場合は current_timestamp は「トランザクションを開始した時刻」で固定されるはずです。 具体的に、どの DB がそのような動作をするか教えていただけますか? 私が調べた限り、 PostgreSQL はおっしゃる通りに動作するようですが、 MySQL は異なりました。 ■PostgreSQL  https://www.postgresql.jp/document/9.1/html/functions-datetime.html#FUNCTIONS-DATETIME-TABLE  > current_timestamp  > 現在の日付と時刻(現在のトランザクションの開始日付時刻)。項9.9.4を参照。 ■MySQL  mysql> BEGIN;  Query OK, 0 rows affected (0.00 sec)    mysql> SELECT CURRENT_TIMESTAMP; SELECT SLEEP(1); SELECT CURRENT_TIMESTAMP;  +---------------------+  | CURRENT_TIMESTAMP |  +---------------------+  | 2017-05-12 17:46:19 |  +---------------------+  1 row in set (0.00 sec)    +----------+  | SLEEP(1) |  +----------+  | 0 |  +----------+  1 row in set (1.00 sec)    +---------------------+  | CURRENT_TIMESTAMP |  +---------------------+  | 2017-05-12 17:46:20 |  +---------------------+  1 row in set (0.00 sec)    mysql> COMMIT;  Query OK, 0 rows affected (0.00 sec)
tacsheaven

2017/05/12 09:23

あー…そういや PostgreSQL くらいか、now() と clock_timestamp() で制御してるの。 MySQL だと「同じステートメント中なら同じと保証する」くらいですか。(ただしストアドプロシージャやトリガーは、その全体を一つのステートメントとみなす) うーん……そもそもクライアント側の時刻をとってもダメ(current_timestamp はサーバ側の時刻だから、ずれてたら意味がない)ですしねえ。
maruhachi

2017/05/20 03:40

おぉ・・・Postgresでそういった挙動があるのは知りませんでした。貴重な情報ありがとうございます。 自分はPostgresを使う予定でしたので、その点は意識しておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問