- PR -

StrutsTestCase for JUnitのテスト実行が上手くいかない

1
投稿者投稿内容
ダメ猫
常連さん
会議室デビュー日: 2004/02/20
投稿数: 45
投稿日時: 2004-02-20 18:14
Cuctusを使用しないでサーブレットとJSPのテストケースを作れと言われて苦戦しております
Strutsを使ってやろうとしたのしたのですが実行時にエラーが出てしまいます。
どうすれば良いかわからずに困っています誰か教えて下さい。
これ以外にJUnitでのサーバーのテストでよい方法があったらそれも教えて下さい

import servletunit.struts.MockStrutsTestCase;

public class ContributionCheckTest extends MockStrutsTestCase {
public ContributionCheckTest(String arg0) {
super(arg0);
}
public static void main(String[] args) {
junit.swingui.TestRunner.run(ContributionCheckTest.class);
}
public void testDoGet() {
setRequestPathInfo("./ContributionCheck");
addRequestParameter("test","test");
actionPerform();
}
}
のテストをJUnitで実行したところ
2004/02/20 17:37:57 org.apache.struts.util.PropertyMessageResources <init>
情報: Initializing, config='org.apache.struts.util.LocalStrings', returnNull=true
2004/02/20 17:37:58 org.apache.struts.util.PropertyMessageResources <init>
情報: Initializing, config='org.apache.struts.action.ActionResources', returnNull=true
2004/02/20 17:37:58 org.apache.struts.action.ActionServlet initServlet
致命的: null
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:303)
at servletunit.struts.MockStrutsTestCase.actionPerform(MockStrutsTestCase.java:371)
at ContributionCheckTest.testDoGet(ContributionCheckTest.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)
2004/02/20 17:37:58 servletunit.struts.MockStrutsTestCase getActionServlet
致命的: Error initializing action servlet
javax.servlet.ServletException: java.lang.NullPointerException
at org.apache.struts.action.ActionServlet.initServlet(ActionServlet.java:1441)
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:303)
at servletunit.struts.MockStrutsTestCase.actionPerform(MockStrutsTestCase.java:371)
at ContributionCheckTest.testDoGet(ContributionCheckTest.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)
と表示されました何がいけないんでしょう?
環境は
j2sdk1.4.2
tomcat4.1
WEB-INF/lib/に置いてあるjarファイルは
strutstest-2.1.0.jar , struts.jar , junit.jar
ツールは
eclipse2.1.2
です
誰か教えて下さい
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-02-20 18:25
StrutsTestCase を使うときは WEB-INF ディレクトリをクラスパスに通す必要がありますが通していますか?

http://strutstestcase.sourceforge.net/

>NOTE: By default, the Struts ActionServlet will look for the file WEB-INF/struts-config.xml, so you must place the directory that contains WEB-INF in your CLASSPATH. If you would like to use an alternate configuration file, please see the setConfigFile() method for details on how this file is located.

[ メッセージ編集済み 編集者: インギ 編集日時 2004-02-20 18:25 ]
ダメ猫
常連さん
会議室デビュー日: 2004/02/20
投稿数: 45
投稿日時: 2004-02-20 18:42
返信ありがとうございます
パスはEclipsのウィンドウ→設定→JAVA→クラス変数で
CLASSPATH - C:/eclipse/plugins/strutstest/examples/WEB-INF
と通していますがこれではいけなかったのでしょうか?
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-02-20 18:49
C:/eclipse/plugins/strutstest/examples
まででいいかもしれません。
ダメ猫
常連さん
会議室デビュー日: 2004/02/20
投稿数: 45
投稿日時: 2004-02-20 18:55
やってみましたがまだ同じエラーになります。
クラスパスの通し方が間違っているのでしょうか?

JUnitの障害トレースではこのように表示されています。

junit.framework.AssertionFailedError: Error initializing action servlet: Unable to find /WEB-INF/web.xml. TestCase is running from C:\eclipse\workspace\ServletTest directory. Context directory has not been set. Try calling setContextDirectory() with a relative or absolute path. /WEB-INF/web.xml must be found under the context directory, the directory the test case is running from, or in the classpath.
at junit.framework.Assert.fail(Assert.java:47)
at servletunit.struts.MockStrutsTestCase.getActionServlet(MockStrutsTestCase.java:319)
at servletunit.struts.MockStrutsTestCase.actionPerform(MockStrutsTestCase.java:371)
at ContributionCheckTest.testDoGet(ContributionCheckTest.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)

yamamoto
会議室デビュー日: 2003/05/16
投稿数: 14
お住まい・勤務地: 福岡
投稿日時: 2004-02-20 19:46
プロジェクトのパスは「C:\eclipse\workspace\ServletTest」のようですが、
プロジェクトの WEB-INF ディレクトリは本当に
「C:/eclipse/plugins/strutstest/examples」にあるのですか?

「C:\eclipse\workspace\ServletTest」内のどこかにあるのではないですか?
ダメ猫
常連さん
会議室デビュー日: 2004/02/20
投稿数: 45
投稿日時: 2004-02-20 19:56
struts-conifg.xmlの存在するWEB-INFは
C:/Tomcat4.1/server/webapps/admin/WEB-INF

C:/eclipse/plugins/strutstest/examples/WEB-INF

が存在していて
C:\eclipse\workspace\ServletTest\WEB-INF
にプロジェクトのクラスは存在しますが
こちらにパスを通せば良いのでしょうか?
ちなみにクラスパスの名前はCLASSPATHとしていますがこれは問題ないでしょうか?
yamamoto
会議室デビュー日: 2003/05/16
投稿数: 14
お住まい・勤務地: 福岡
投稿日時: 2004-02-20 20:37
web.xml と アクション "ContributionCheck" を定義している struts-config.xml は
「C:\eclipse\workspace\ServletTest\WEB-INF」にはないのですか?

例えば、

プロジェクトパス
  C:\eclipse\workspace\ServletTest

WEB-INFパス
  C:\eclipse\workspace\ServletTest\WEB-INF

struts-config.xml
  C:\eclipse\workspace\ServletTest\WEB-INF\struts-config.xml
  に「ContributionCheck」のアクションが定義されている

の場合、

「ContributionCheckTest」は

コード:
public class ContributionCheckActionTest extends MockStrutsTestCase {


public ContributionCheckActionTest(String arg0) {
super(arg0);
}

public static void main(String[] args) {
junit.awtui.TestRunner.run(ContributionCheckActionTest.class);
}

public void setUp() throws Exception {
super.setUp();
setContextDirectory(new File("."));
}

final public void testContributionCheck() {
setRequestPathInfo("/ContributionCheck.do");
addRequestParameter("test","test")
actionPerform();
verifyForward("success");
}
}



というように私はします。
setContextDirectory でコンテキストディレクトリをセットします。
(この場合、プロジェクトパスそのもの)

ちなみに「設定→JAVA→クラス変数」は
パスを通すものではありません。
その変数名でクラスパスに追加できる為の設定です。(よね?)

説明が下手でごめんなさい。

[ メッセージ編集済み 編集者: yamamoto 編集日時 2004-02-20 20:39 ]
1

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