S2Unit

S2では、コンテナを使った開発のテストを楽しくおこなえるようにテスティングフレームワークが組み込まれています。JUnitを拡張しています。主な機能は以下のとおりです。

Example

ここでは、トランザクションの自動制御をテストするRequiredAdviceTestを見てみましょう。

TxBean.java

package test.org.seasar.extension.tx;

import javax.transaction.SystemException;

public interface TxBean {

    public boolean hasTransaction() throws SystemException;
}

TxBeanImpl.java

package test.org.seasar.extension.tx;

import javax.transaction.Status;
import javax.transaction.SystemException;
import javax.transaction.TransactionManager;

public class TxBeanImpl implements TxBean {

    private TransactionManager tm_;

    public TxBeanImpl(TransactionManager tm) {
        tm_ = tm;
    }

    public boolean hasTransaction() throws SystemException {
        System.out.println(tm_.getTransaction());
        return tm_.getStatus() != Status.STATUS_NO_TRANSACTION;
    }
}

RequiredAdviceTest-config.xml

<components>
<component class="org.seasar.extension.jta.TransactionManagerImpl"/>
<component name="tx/required"
class="org.seasar.extension.tx.RequiredAdvice"/>
<component class="test.org.seasar.extension.tx.TxBeanImpl">
<aspect>tx/required</aspect>
</component>
</components>

RequiredAdviceTest.java

package test.org.seasar.extension.tx;

import javax.transaction.Status;
import javax.transaction.TransactionManager;

import junit.framework.Test;
import junit.framework.TestSuite;

import org.seasar.extension.unit.S2TestCase;

public class RequiredAdviceTest extends S2TestCase {

    private static final String PATH =
        "test/org/seasar/extension/tx/RequiredAdviceTest-config.xml";
    private TxBean txBean_;
    private TransactionManager tm_;

    public RequiredAdviceTest(String name) {
        super(name);
    }

    public void testInvoke() throws Exception {
        assertEquals("1", true, txBean_.hasTransaction());
        assertEquals("2", Status.STATUS_NO_TRANSACTION, tm_.getStatus());
    }
    
    public void testInvoke2() throws Exception {
        tm_.begin();
        assertEquals("1", true, txBean_.hasTransaction());
        assertEquals("2", Status.STATUS_ACTIVE, tm_.getStatus());
        tm_.commit();
    }

    protected void setUp() throws Exception {
        include(PATH);
    }

    protected void tearDown() throws Exception {
    }

    public static Test suite() {
        return new TestSuite(RequiredAdviceTest.class);
    }

    public static void main(String[] args) {
        junit.textui.TestRunner.main(
            new String[] { RequiredAdviceTest.class.getName()});
    }
}
コンポーネントの組み立てやコンポーネントの取り出しといった作業はS2TestCaseが自動的にやってくれて、各テストメソッドは本来必要なことに集中できることが分かっていただけたと思います。