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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

JUnit

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

Java

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

Apache Tomcat

Apache TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

Q&A

解決済

2回答

5367閲覧

JUnitの単体テストにおいてJNDIによるData Resource検索のinitContext.lookupが上手く行えない

hogwan

総合スコア13

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

JUnit

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

Java

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

Apache Tomcat

Apache TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

0グッド

0クリップ

投稿2021/05/02 04:54

編集2021/05/02 05:27

前提・実現したいこと

JUnitの単体テストにおいてJNDIを使ってMySQLとのConnectionを確立したい。

発生している問題・エラーメッセージ

以下はJunitテストを実行している最中に出たエラーを記載しています。

javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or in an application resource file: java.naming.factory.initial

該当のソースコード

java

1abstract public class BaseDAO { 2 public Connection connect() throws SQLException, NamingException { 3 Context initContext = new InitialContext(); 4 // 以下でエラー 5 Context envContext = (Context)initContext.lookup("java:comp/env"); 6 DataSource ds = (DataSource)envContext.lookup("jdbc/ecsite"); 7 Connection con = ds.getConnection(); 8 return con; 9 } 10 11 public void disconnect(Connection con) throws SQLException { 12 if (con != null) { 13 con.close(); 14 } 15 } 16}

試したこと

  • DriverManagerを利用した接続の場合は上手く繋げられることを確認しています。
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/ecsite", "ecsite", "password");
  • mysql-connector-java-8.0.24をWEB-INF/lib下に置く
  • mysql-connector-java-8.0.24をC:\pleiades\tomcat\9\lib下に置く
  • META-INF下のcontext.xmlを以下のように設定
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE Context> <Context reloadable="true"> <Resource name="jdbc/ecsite" auth="Container" type="javax.sql.DataSource" driverClassName="com.mysql.cj.jdbc.Driver" url="jdbc:mysql://localhost:3306/ecsite?serverTimezone=JST&amp;characterEncoding=UTF-8" username="ecsite" password="password" maxTotal="100" maxIdle="30" maxWaitMillis="10000" validationQuery="SELECT 0" removeAbandonedOnBorrow="true" removeAbandonedTimeout="60" /> </Context>
  • WEB-INF下のweb.xmlを以下のように設定
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0"> <display-name>Ecsite</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <resource-ref> <res-ref-name>jdbc/ecsite</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> </web-app>
  • C:\pleiades\tomcat\9\conf下のserver.xmlのResourceタグをweb.xmlのように設定してみる(現在はデフォルトのままにしています)

補足情報(FW/ツールのバージョンなど)

  • MySQL --version: 8.0.24
  • tomcat --version: 9
  • java --version: 11

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

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

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

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

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

guest

回答2

0

JUnitの単体テストにおいて...

テストのソースが提示されていないのでどうなのかはわかりませんが。
context.xmlファイルやweb.xmlファイルは、サーブレットコンテナ(Tomcat)が参照するファイルであって、単純にJUnitでテストを書いただけではそれらのファイルは参照されないでしょう。それらのファイルを参照していないのだから、とうぜんJNDIまわりの設定は何も為されていない。だから、javax.naming.NoInitialContextException
ということなのではないかと。

ここらを参考にしてみてはいかがかと。

投稿2021/05/02 12:18

shiketa

総合スコア3971

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

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

hogwan

2021/05/03 03:44

ご連絡ありがとうございます。 >context.xmlファイルやweb.xmlファイルは、サーブレットコンテナ(Tomcat)が参照するファイルであって、単純にJUnitでテストを書いただけではそれらのファイルは参照されない こちらですが,なぜJUnitではcontext.xmlやweb.xmlは参照されないのでしょうか。ここら辺の一次情報を探してみましたが,見つからず,ご教授いただけますと幸いです。
shiketa

2021/05/03 07:21

> なぜ なぜ。なぜ。ふむー。一次情報の最たるものは、ソースでしょうか https://github.com/junit-team 。JUnitはテストのフレームワークなので、それ以外のフレームワークやライブラリ、たとえばJNDIが必要であれば、テストのまえにそれらのセットアップをする、というのがわたしのなかでの大前提。なので、「なぜ」と考えたことはないですね。「なぜ」と浮かぶまえに「ああそいつらセットアップしていないからだわ」と思い込むので。 なぜなのかわかったら、わたしにも教えてください。
hogwan

2021/05/03 13:10

ありがとうございます! 今回の質問はJUnitのsetupに初期設定を記述することで解決できました。ご教授いただき誠にありがとうございました。
guest

0

自己解決

setupで以下を記述する。

@BeforeAll static void setUpContext() throws Exception { try { System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.naming.java.javaURLContextFactory"); System.setProperty(Context.URL_PKG_PREFIXES, "org.apache.naming"); InitialContext ic = new InitialContext(); ic.createSubcontext("java:"); ic.createSubcontext("java:comp"); ic.createSubcontext("java:comp/env"); ic.createSubcontext("java:comp/env/jdbc"); MysqlDataSource ds = new MysqlDataSource(); ds.setUser("ecsite"); ds.setPassword("password"); ds.setDatabaseName("ecsite"); ds.setServerName("localhost"); ds.setPortNumber(3306); ic.bind("java:comp/env/jdbc/ecsite", ds); } catch (NamingException ex) { ex.printStackTrace(); } }

投稿2021/05/03 13:11

hogwan

総合スコア13

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問