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

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

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

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

Java

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

Q&A

解決済

2回答

3892閲覧

APIのラッパークラスおよび実装クラスのテストについて

elz4m

総合スコア69

JUnit

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

Java

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

0グッド

1クリップ

投稿2017/06/20 01:39

編集2017/06/20 03:27

※業務関連の用語などをぼかして記述するため、一部あいまいになってしまいますが
ご了承ください。

###前提
現在Javaの開発で、将来のJavaバージョンアップに備え、SQL系のAPIをラップするクラスを作成しています。
アプリ→実装クラス→ラッパークラス
という流れを想定しており、アプリが実装クラスに対して呼び出し、実装クラスではラッパークラスでラップした
APIを必要に応じてオーバーライドする。

業務での製造ですので、一定のカバレッジを持つテストクラスが求められています。

###実現したいこと
実行したところのカバレッジ(今回は実装クラスに対して呼び出し、ラッパークラスのカバレッジを取得したいです。)
以下のような実装を呼び出せている(=カバレッジが見込める)テストを行いたいのですが、
どのようにテストクラスを作成すればよいのでしょうか。
実際にDBには接続せずに、呼び出せていることの確認を行いたいです。

※使用できるツール類は
・Eclipse
・Junit
・Mockito
・PowerMock
になっています。

###ソース

java

1実装クラス 2 3実装クラスのコンストラクタ(Connection con,Statement stmt){ 4 super(con,stmt); 5 this.con=con; 6 this.stmt=stmt; 7}

java

1ラッパークラス 2 3ラッパークラスのコンストラクタ(Connection con,Statement stmt){ 4 this.con=con; 5 this.stmt=stmt; 6} 7 8/** 9* 例(java.sql.Statement#executeQuery) 10*/ 11public ResultSet executeQuery(String sql)throws SQLException{ 12 return stmt.executeQuery(sql); 13} 14以下同様のAPIの実装が続く

以下のようなテストクラスを試したところ、問題なく実行され、Junitのバーはオールグリーンになるのですが、
ラッパークラスのカバレッジが取れず、プロジェクトのエビデンスとしては不十分でした。

java

1テストクラス 2 3@Mock 4private 実装クラス sqlstmt = mock(実装クラス.class) ; 5 6@Before 7public void setUp()throws Exception{ 8 MockitoAnnotations.initMocks(this); 9} 10 11/* 12* 13*その他Eclipseにて自動生成されるメソッドなど(中身なし) 14* 15/* 16 17 18@Test 19public ResultSet TestExecuteQuery(){ 20 try{ 21 sqlstmt.executeQuery(null); 22 }catch(SQLException e){ 23 fail("失敗"); 24 } 25} 26

申し訳ありませんが、よろしくお願いいたします。

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

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

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

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

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

7tsuno

2017/06/20 03:22

テストクラスのstmtは実装クラスですか?ラッパークラスですか?sqlstmtの間違いですか? 実装クラスとラッパークラスの関係がよく分からないのですが、実装クラス extends ラッパークラスということですか?
elz4m

2017/06/20 03:27

テストクラスのstmtはsqlstmtの間違いです、申し訳ありません修正します。その通りです、実装クラスextendsラッパークラスの関係性です。
guest

回答2

0

ベストアンサー

Mockitoを理解して利用していますか?
private 実装クラス sqlstmt = mock(実装クラス.class) ;
を行っている時点でsqlstmtがmock化されてしまうので、実際のロジックを通すことが出来なくなります。
java.sql.Statementをmock化して試験を行うことで実施したいことが出来るのではないでしょうか?

投稿2017/06/20 03:29

7tsuno

総合スコア310

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

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

elz4m

2017/06/20 04:38 編集

>private 実装クラス sqlstmt = mock(実装クラス.class) ; >を行っている時点でsqlstmtがmock化されてしまうので、実際のロジックを通すことが出来なくなりま >す。 そのあたりの理解があいまいでした、ありがとうございます。 java.sql.Statementはインターフェースだと認識しているのですが、powermockでMock化できるんでしたっけ。。。 そのあたりの記述も教えていただけないでしょうか。 すみませんがよろしくお願いいたします。
elz4m

2017/06/20 04:56

自己解決しました。 7tsuno様の回答を参考にラッパークラスをMock化し、実装クラスにInjectMocksして実行すると期待していた結果が得られました。 ありがとうございました。
guest

0

そもそもなんですが、テストメソッドが

Java

1@Test 2public ResultSet TestExecuteQuery(){ 3 try{ 4 stmt.executeQuery(null); 5 }catch(SQLException e){ 6 fail("失敗"); 7 } 8}

になってますけれども、これラッパークラスをコールしてないのでは?
(ラッパークラス#executeQuery呼んでないのでは?)

投稿2017/06/20 03:24

kurokoba

総合スコア276

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

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

elz4m

2017/06/20 03:28

申し訳ありません、テストメソッド内のstmtはsqlstmtの間違いです、修正いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問