S2JUnit4PluginをSandbox申請してみた

[operation:2133] [申請] S2JUnit4Plugin

構想としてはテストフレームワークとしてのDIコンテナ - wyukawa’s blogから変わっていないのですが、師匠が
http://blog.tsukuba-bunko.jp/ppoi/archives/2008/10/re-wyukawa-quic.htmlといっているのでSandbox申請してみました。

なのでQuickJUnitプラグインをちらほら調査しています。で今日判明したこと。

設定画面が無い。

この件は

にあるようにplugin.xmlを非コメントアウトすればでてきます。

r55でコメントアウトされたようですが、その理由はひょっとしたら下記のようなことかも。

JUnitを作成するときに

java.lang.NoSuchFieldException: fPage
	at java.lang.Class.getDeclaredField(Class.java:1854)
	at junit.extensions.eclipse.quick.OpenTestingPairAction.setUpNewClassCreationWizard(OpenTestingPairAction.java:95)
	at junit.extensions.eclipse.quick.OpenTestingPairAction.openPairWizard(OpenTestingPairAction.java:78)
	at junit.extensions.eclipse.quick.OpenTestingPairAction.runWhenTestingPairNotExist(OpenTestingPairAction.java:166)
	at junit.extensions.eclipse.quick.OpenTestingPairAction.run(OpenTestingPairAction.java:132)
	at org.eclipse.ui.internal.PluginAction.runWithEvent(PluginAction.java:251)
	at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:583)
	at org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:500)
	at org.eclipse.jface.action.ActionContributionItem$5.handleEvent(ActionContributionItem.java:411)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1003)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3823)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3422)
	at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2382)
	at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2346)
	at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2198)
	at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:493)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:288)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:488)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:113)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:193)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:386)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
	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:585)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:549)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:504)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1236)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1212)

というスタックトレースがでます(プラグインをインストールして実行したらでないかも)。

でもその後の動作にはとりあえず問題無いようだったのですが、テストケース生成ウィザードに出てくるテスト名が必ず〜Testになります。
設定画面を有効にして命名規約をTest以外にしても同じです。この問題があるからひょっとしたらコメントアウトしたのかも。

ちなみにNoSuchFieldExceptionがでるのはEclipse3.1以降ではorg.eclipse.jdt.internal.junit.wizards.NewTestCaseCreationWizardで

private NewTestCaseWizardPageOne fPage1;

となってるからだと思います。

ちなみにEclipse3.0のときは、

private NewTestCaseWizardPageOne fPage;

なのでEclipse3.0ならうまくいくかも。

ともあれ、以下のように修正すれば、設定画面、テストクラスの命名規約を有効にでき、ついでにTODOもなくせますw

Index: plugin.xml
===================================================================
--- plugin.xml	(revision 184)
+++ plugin.xml	(working copy)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <?eclipse version="3.0"?>
 <plugin>
-<!--
+
    <extension
          point="org.eclipse.ui.preferencePages">
       <page
@@ -11,7 +11,7 @@
             id="junit.extensions.eclipse.quick.QuickJUnitPreferencePage">
       </page>
    </extension>
--->
+
    <extension
          point="org.eclipse.ui.popupMenus">
       <viewerContribution
Index: src/junit/extensions/eclipse/quick/OpenTestingPairAction.java
===================================================================
--- src/junit/extensions/eclipse/quick/OpenTestingPairAction.java	(revision 184)
+++ src/junit/extensions/eclipse/quick/OpenTestingPairAction.java	(working copy)
@@ -92,7 +92,7 @@
             return;
         try {
             String typeName = extractTypeName(pairNames[0]);
-            Field pageField = wizard.getClass().getDeclaredField("fPage"); //$NON-NLS-1$
+            Field pageField = wizard.getClass().getDeclaredField("fPage1"); //$NON-NLS-1$
             pageField.setAccessible(true);
             Object page = pageField.get(wizard);
             Method setTypeNameMethod = page.getClass().getMethod("setTypeName",
@@ -100,8 +100,7 @@
             setTypeNameMethod.setAccessible(true);
             setTypeNameMethod.invoke(page, new Object[]{typeName, Boolean.TRUE});
         } catch (Exception e) {
-            // TODO: log
-            e.printStackTrace();
+            QuickJUnitPlugin.getDefault().handleSystemError(e, this);
         }
     }