- PR -

MockStrutsTestCaseをEclipse上で実行してNullPointerException発生

1
投稿者投稿内容
bes
会議室デビュー日: 2003/10/30
投稿数: 3
投稿日時: 2003-10-30 17:35
はじめまして。普段から拝見させていただき勉強させていただいております。
現在StrutsTestCaseを用いたテストを行っておりますが、NullPointerExceptionが発生しており、原因が分からず困っております。

環境 Windows2000
Eclipse 2.1.1
StrutsTestCase 2.0

junit.framework.AssertionFailedError: java.lang.NullPointerException
at servletunit.struts.MockStrutsTestCase.getActionServlet(MockStrutsTestCase.java:285)
at servletunit.struts.MockStrutsTestCase.actionPerform(MockStrutsTestCase.java:332)
at sample.ActionStrutsTest.testSample(ActionStrutsTest.java:34)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at junit.framework.TestCase.runTest(TestCase.java:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at junit.framework.TestSuite.runTest(TestSuite.java:208)
at junit.framework.TestSuite.run(TestSuite.java:203)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:392)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:276)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:167)

サンプルとしてMockStrutsTestCaseを継承した
ActionStrutsTestを作成し、StrutsTestCaseを実行したところ、
上記のようなスタックトレースが発生しました。
ちなみにstruts-configはEclipse上にconfディレクトリを作成し、その下の
WEB-INFディレクトリ内においております。
(confディレクトリにはクラスパスを通しています。)
どうやらStrutsTestCaseクラス内でActionServletのinit(config)のメソッド呼び出しで
発生しているところまでは突き止めたのですが。。。
ご教授よろしくお願いします。
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2003-11-03 22:59
besさん、こんちには。

MockStrutsTestCase.java の 285行目はどのようなコードですか?

そこから順に辿って見ませんか?
(フレームワークがらみなので、簡単にいくかはわかりませんが。)
おかもと
大ベテラン
会議室デビュー日: 2003/06/08
投稿数: 182
投稿日時: 2003-11-08 12:11
元質問者に代わってお答えします。

該当の行を含むメソッドは以下の通りです。

270 public ActionServlet getActionServlet() {
271 if (logger.isDebugEnabled())
272 logger.debug("Entering getActionServlet()");
273 init();
274 try {
275 if (!actionServletIsInitialized) {
276 if (logger.isDebugEnabled()) {
277 logger.debug("getActionServlet() : intializing actionS ervlet");
278 }
279 this.actionServlet.init(config);
280 actionServletIsInitialized = true;
281 }
282 } catch (ServletException e) {
283 if (logger.isDebugEnabled())
284 logger.debug("Error in getActionServlet()",e.getRootCause( ));
285 throw new AssertionFailedError(e.getMessage());
286 }
287 if (logger.isDebugEnabled())
288 logger.debug("Exiting getActionServlet()");
289 return actionServlet;
290 }

左側の数字が行番号です。ServletExceptionが発生した原因を
調べる必要がありそうです。と思ったらコンソールにもっと詳しい
トレースが出力されていました。

java.lang.NullPointerException
at org.apache.crimson.parser.Parser2.parseInternal(Parser2.java:658)
at org.apache.crimson.parser.Parser2.parse(Parser2.java:333)
at org.apache.crimson.parser.XMLReaderImpl.parse(XMLReaderImpl.java:448)
at org.apache.commons.digester.Digester.parse(Digester.java:1567)
at org.apache.struts.action.ActionServlet.initServlet(ActionServlet.java:1433)
at org.apache.struts.action.ActionServlet.init(ActionServlet.java:466)
at javax.servlet.GenericServlet.init(GenericServlet.java:256)
at servletunit.struts.MockStrutsTestCase.getActionServlet(MockStrutsTestCase.java:279)
at servletunit.struts.MockStrutsTestCase.actionPerform(MockStrutsTestCase.java:332)

struts-config.xmlを見つけられないのかな?

bes
会議室デビュー日: 2003/10/30
投稿数: 3
投稿日時: 2003-11-08 17:10
ご回答ありがとうございます。
Kissingerさん 返信が送れて申し訳ありません。
おかもとさんがご指摘したとおり、279行目の

this.actionServlet.init(config);

で例外が発生しています。
GenericServletのinit(ServletConfig config)メソッドで
NullPointerExceptionがおきているみたいです。
もう少し調べて見ます。


Emacs信者
常連さん
会議室デビュー日: 2003/08/10
投稿数: 38
投稿日時: 2003-11-08 18:14
ActionServletの1433行目付近は、以下の通りです。

コード:
  InputStream input =
      getServletContext().getResourceAsStream("/WEB-INF/web.xml");

  try {
      digester.parse(input); //1433行目

  } catch (IOException e) {
      log.error(internal.getMessage("configWebXml"), e);
      throw new ServletException(e);



このコードにある通り、
おそらくweb.xmlが見つからないのではないでしょうか。
おかもと
大ベテラン
会議室デビュー日: 2003/06/08
投稿数: 182
投稿日時: 2003-11-08 22:52
なるほど、MockObjectを使う場合はコンテキストルートを
明示してあげなければならないということですね。
setContextDirectoryというメソッドが用意されていました。
一歩前進です。ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)