S2FrameworkTestCase の unbindFields の件
http://ml.seasar.org/archives/seasar-user/2006-July/006132.html
について、僕の修正案だと問題がありますね。
protected void unbindFields() { for (Class clazz = getClass(); clazz != S2FrameworkTestCase.class && clazz != null; clazz = clazz.getSuperclass()) { Field[] fields = clazz.getDeclaredFields(); for (int i = 0; i < fields.length; ++i) { unbindField(fields[i]); } } } protected void unbindField(Field field) { if (isAutoBindable(field)) { field.setAccessible(true); FieldUtil.set(field, this, null); } }
このコード自体は別にいいのですが、runBase() の実装が、
public void runBare() throws Throwable { setUpContainer(); setUp(); try { setUpForEachTestMethod(); try { container.init(); try { setUpAfterContainerInit(); try { bindFields(); setUpAfterBindFields(); try { doRunTest(); } finally { tearDownBeforeUnbindFields(); unbindFields(); } } finally { tearDownBeforeContainerDestroy(); } } finally { container.destroy(); } } finally { tearDownForEachTestMethod(); } } finally { tearDown(); tearDownContainer(); } }
このようになっているため、unbindFields() をしてしまうと、テストクラスで宣言したフィールドが tearDownForEachTestMethod()、tearDown() で使用できなくなってしまいます。
S2TestCase で宣言している dataSource、connection なども null セットされてしまうので、tearDownDataSource() もちゃんと動作しません。
runBase() をこんな感じに修正すると良いのかなと思います。
public void runBare() throws Throwable { setUpContainer(); try { setUp(); try { setUpForEachTestMethod(); try { getContainer().init(); try { setUpAfterContainerInit(); try { bindFields(); setUpAfterBindFields(); doRunTest(); } finally { tearDownBeforeContainerDestroy(); } } finally { getContainer().destroy(); } } finally { tearDownForEachTestMethod(); } } finally { tearDown(); } } finally { try { try { tearDownBeforeUnbindFields(); } finally { unbindFields(); } } finally { tearDownContainer(); } } }