7

組み込みのJBossでのTestNGの使用から、リモートサーバーでのArquillianの使用に移行しています。

いくつかのテストセットアップを行う@BeforeClassで注釈が付けられたメソッドを持つ簡単なテストを実行しています。多くの調査の結果、セットアップメソッドが2回呼び出されているようです。1回はMavenコマンドを実行してテストを実行しているコンソールで、もう1回はテスト戦争がリモートサーバーにデプロイされてテストが実行されたときです。これらは2つの別個のJVMです。1つはコンテナーの外部で実行され、もう1つはコンテナーの内部で実行されます。私の好みは、後者を実行することです。

これは私が期待すべき振る舞いですか、それとも私が見逃しているかもしれない何かがありますか?

今のところ、実際にコンテナ内にあるかどうかを確認しており、入っている場合は、セットアップコードを実行します。これは機能しますが、もっと良い方法があるかどうか知りたいです。

コードの一部のスニペット(コードの単純さと、setupComponentsメソッドが実際には必要ないという事実を無視してください。移行するテストには、この機能が必要になる、はるかに複雑なテストがあります)。

public class BaseTest extends Arquillian
{
    private static Log log = LogFactory.getLog( SeamTest.class );

    @Deployment
    public static Archive<?> createDeployment()
    {
        // snip... basically, we create a test war here
    }

    /**
     * todo - there might be a better way to do this
     */
    private boolean runningInContainer()
    {
        try
        {
            new InitialContext(  ).lookup( "java:comp/env" );
            return true;
        }
        catch (NamingException ex)
        {
            return false;
        }
    }

    @BeforeClass
    public void setupOnce() throws Exception
    {
        getLog().debug( "in setupOnce(): " + runningInContainer() );
        if ( runningInContainer() )
        {
            new ComponentTest()
            {
                protected void testComponents() throws Exception
                {
                    setupComponents();
                }
            }.run();
        }
    }

    public User createUser()
    {
        // ...
    }

    public Log getLog()
    {
        // snip...
    }

    public UserDao getUserDao()
    {
        // ...
    }

    public abstract class ComponentTest
    {
        protected abstract void testComponents() throws Exception;

        public void run() throws Exception
        {
            try {
                testComponents();
            } finally {

            }
        }
    }

}

public class UserDaoTest extends BaseTest
{
    UserDao userDao;

    @Override
    protected void setupComponents()
    {
        getLog().debug( "in setupComponents: " + runningInContainer() );
        userDao = getUserDao();
    }

    @Test
    public void testGetUser() throws Exception
    {
        getLog().debug( "in testGetUser: " + runningInContainer() );

        new ComponentTest()
        {
            protected void testComponents() throws Exception
            {
                User user0 = createUser();
                user0.setName( "frank" );

                userDao.merge( user0 );

                User retrievedUser = userDao.findByName( "frank" );
                assertNotNull( retrievedUser );
            }

        }.run();
    }

}

これにより、基本的に次のような出力が得られます。

mvnが実行されているコンソールから:

in setupOnce(): false

jbossサーバーから:

in setupOnce(): true
in setupComponents: true
in testGetUser: true
4

1 に答える 1

5

これは「予想される」動作です。あまり良くありませんが、それがArqullianの仕組みです。

JUnit

  • @BeforeClass / @AfterClassは、ClientSideでのみ実行されます
  • テストクラスの状態は@Test間で失われ、コンテナではテストごとにライフサイクル全体が繰り返されます
  • @Before / @Afterは、実行モード(クライアント/サーバー)に応じて実行されます

TestNG

  • すべてがサーバーとクライアントの両方で実行されます
于 2013-06-11T03:52:07.740 に答える