質問

次のテストは、このテスト Bean が Spring によって 2 回初期化されることを示しています。一度だけのはずなので、なぜそうなるのか誰かが教えてくれることを願っています。テストは次のとおりです。

import org.apache.log4j.Logger;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {} )
public class TestAfterPropsSet implements InitializingBean {

private static final Logger logger = Logger.getLogger(TestAfterPropsSet.class);

@Test
public void test1() {
    logger.debug("Test1");
}

@Test
public void test2() {
    logger.debug("Test2");      
}

public void afterPropertiesSet() throws Exception {
    logger.debug("Bean Initialized");       
}
} // end class

Bean ファイルは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>

出力は次のとおりです。

2009-10-13 21:20:04,393 [TestAfterPropsSet.java 26] DEBUG - Bean Initialized
2009-10-13 21:20:04,393 [TestAfterPropsSet.java 17] DEBUG - Test1
2009-10-13 21:20:04,393 [TestAfterPropsSet.java 26] DEBUG - Bean Initialized
2009-10-13 21:20:04,393 [TestAfterPropsSet.java 22] DEBUG - Test2
役に立ちましたか?

解決

春の大会ではありません。JUnit の規則に従う必要があります。スイート全体の初期化または分解は、それに応じて @BeforeClass および @AfterClass で実行する必要があります。あるいは、@Autowire を使用して Spring にオブジェクトのスコープを処理させることもできます。

テストごとに新しいスイートが構築されます。これは、指定されたテスト名を使用して新しいスイートを作成する必要があった JUnit3 でより顕著です。

を見てください。 JavaDoc:

テストアノテーションは、Junitに、それが添付されているパブリックボイド法をテストケースとして実行できることを伝えます。 メソッドを実行するために、Junitは最初にクラスの新しいインスタンスを構築し、次に注釈付きメソッドを呼び出します。 テストによってスローされた例外は、Junitによって失敗として報告されます。例外がスローされない場合、テストは成功したと想定されています。

テストは実際には何も行っておらず、参照する Bean がないため、ユースケースは少しわかりにくいです。デフォルトでは、Spring Bean はデフォルトのscope="singleton" 属性で宣言されるため、実際に Bean を宣言した場合、それはキャッシュされたシングルトンになるでしょう。ただし、これはメソッドの実行とは関係ありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top