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

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

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

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

Java

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

Q&A

解決済

3回答

18318閲覧

JmockitでJava標準APIをモック化し、例外クラスをスローさせたい

SaganoKei

総合スコア13

JUnit

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

Java

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

0グッド

0クリップ

投稿2018/06/24 01:31

編集2018/06/27 06:08

問題

JUnit+Jmockitで、DAOクラスのテストケースを作成しているのですが、DAOの異常系ルートの検査をしたくてDriverManager.getConnection()メソッドとConnnection.close()メソッドでExceptionを投げさせたいと考えてます。
ただ、ネット等ではnew Expectationsで指定しているものが散見されますが、それで実際カバレッジをしてみるとうまくスロー出来ておらず困っています。なにか良い方法はないでしょうか。

追記:
先日テストメソッドを作り直してみたところ、DriverManagerメソッドのモック化には成功しました。
ただ、Connectionクラスのモック化は今だ作れていません。
Connectionクラスがインターフェースであることが要因だと推測はしているのですが・・・

ソースコード

Java

1 2@Mocked 3DriverManager DriverManager; 4@Mocked 5Connnection conn; 6 7// テスト対象 8DAO dao = new DAO(); 9 10@Test 11public void DM異常系1(){ 12 new Expectations() {{ 13 DriverManager.getConnection(); result = new ClassNotFoundException(); 14 }}; 15 dao.method(); 16} 17@Test 18public void DM異常系2(){ 19 new Expectations() {{ 20 DriverManager.getConnection(); result = new SQLException(); 21 }}; 22 dao.method(); 23} 24@Test 25public void Conn異常系1(){ 26 new Expectations() {{ 27 conn.close(); result = new SQLException(); 28 }}; 29 dao.method(); 30} 31

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

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

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

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

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

guest

回答3

0

インタフェース自体には実装が含まれないからMockするにも動作が付けられないような気がします。
以下のようにConnectionインタフェースを実体化したインスタンスを使うのではだめでしょうか?

java

1@Test 2public void Conn異常系1(){ 3 Boo mockConnection= new MockUp<Connection >() { 4 @Mock 5 public void close() { 6 throw new SQLException(); 7 } 8 }.getMockInstance(); 9 10 New Expectations(){ 11 DriverManager.getConnection(); result = mockConnection; 12 } 13 dao.method(); 14}

【参考】
Qiita - JMockit はじめの一歩

投稿2018/06/26 02:10

euledge

総合スコア2404

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

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

SaganoKei

2018/06/28 01:08

アドバイスありがとうございます!参考のサイトは何度か目にしたはずなのですが完全に素通りしてました…(汗
guest

0

自己解決

回答者の方アドバイスありがとうございました!
euledgeさんとasahina1979さんの回答をヒントに試行錯誤したところ、無事異常系の網羅に成功しましたので以下にソースコードを添付しておきます。

Java

1@Mocked 2DriverManager dm; 3// テスト対象 4DAO dao = new DAO(); 5 6@Test(expected = ClassNotFoundException.class) 7public void DM異常系1() throws Exception { 8 // getConnection()メソッドの挙動定義 9 new Expectations() {{ 10 DriverManager.getConnection(anyString, anyString, anyString); result = new ClassNotFoundException(); 11 }}; 12 13 // メソッド実行 14 dao.method(); 15} 16 17@Test(expected = SQLException.class) 18public void DM異常系2() throws Exception { 19 // Connectionインターフェースクラスのモックインスタンス生成 20 Connection connMock = new MockUp<Connection>() { 21 @Mock 22 public PreparedStatement prepareStatement(String sql) throws Exception { 23 throw new SQLException(); 24 } 25 }.getMockInstance(); 26 // getConnection()メソッドの挙動定義 27 new Expectations() {{ 28 DriverManager.getConnection(anyString, anyString, anyString); result = connMock; 29 }}; 30 31 // メソッド実行 32 dao.method(); 33} 34 35@Test(expected = SQLException.class) 36public void Conn異常系1() throws Exception { 37 // DB設定 ※対象クラスと同様の引数にする 38 Class.forName(//JDBCドライバ); 39 Connection conn = DriverManager.getConnection(//DBアドレス, 管理者名, パスワード); 40 41 // Connectionインターフェースクラスのモックインスタンス生成 42 Connection connMock = new MockUp<Connection>() { 43 @Mock 44 public PreparedStatement prepareStatement(String sql) throws Exception { 45 return conn.prepareStatement(sql); 46 } 47 @Mock 48 public void close() throws SQLException { 49 throw new SQLException(); 50 } 51 }.getMockInstance(); 52 // getConnection()メソッドの挙動定義 53 new Expectations() {{ 54 DriverManager.getConnection(anyString, anyString, anyString); result = connMock; 55 }}; 56 57 // メソッド実行 58 dao.method(); 59}

投稿2018/06/28 01:04

編集2018/06/28 08:48
SaganoKei

総合スコア13

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

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

0

考え方だけですが。

DriverManager.getConnection を mock 化できたのでしたら
戻り値を close で例外発生する Connection の ラッパー に差し替えてしまえばいいだけかと思います。

投稿2018/06/26 02:26

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問