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();
            }
        }
    }