web-dev-qa-db-ja.com

Springを使用して@PostConstructメソッドを持つクラスのコンストラクターをテストする方法

@PostConstructメソッドを含むクラスがある場合、JUnitとSpringを使用してそのコンストラクタ、つまり@PostConstructメソッドをテストするにはどうすればよいですか? Springを使用していないため、単にnew ClassName(param、param)を使用することはできません。@ PostConstructメソッドが起動されていません。

ここに明らかなものがないのですか?

public class Connection {

private String x1;
private String x2;

public Connection(String x1, String x2) {
this.x1 = x1;
this.x2 = x2;
}

@PostConstruct
public void init() {
x1 = "arf arf arf"
}

}


@Test
public void test() {
Connection c = new Connection("dog", "ruff");
assertEquals("arf arf arf", c.getX1();
}

これと似たもの(少し複雑ですが)があり、@ PostConstructメソッドがヒットしません。

24
AHungerArtist

Spring JUnit Runner をご覧ください。

Springがクラスを構築し、post構築メソッドも呼び出すように、テストクラスにクラスを注入する必要があります。ペットクリニックの例を参照してください。

例えば:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:your-test-context-xml.xml")
public class SpringJunitTests {

    @Autowired
    private Connection c;

    @Test
    public void tests() {
        assertEquals("arf arf arf", c.getX1();
    }

    // ...
14
Sridhar G

Connectionの唯一のコンテナー管理部分が@PostContructメソッド。テストメソッドで手動で呼び出すだけです。

@Test
public void test() {
  Connection c = new Connection("dog", "ruff");
  c.init();
  assertEquals("arf arf arf", c.getX1());
}

それ以上、依存関係などがある場合でも、手動で挿入するか、またはSridharが述べたように、Springテストフレームワークを使用できます。

24
mrembisz

デフォルトでは、Springは@PostConstructおよび@PreDestroyアノテーションを認識しません。これを有効にするには、 ‘CommonAnnotationBeanPostProcessor‘を登録するか、Bean構成ファイルで ‘‘を指定する必要があります。

<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />

または

<context:annotation-config />

0
Dandy

@PostConstructはオブジェクトの状態を変更している必要があります。したがって、JUnitテストケースでは、Beanを取得した後、オブジェクトの状態を確認します。 @PostConstructによって設定された状態と同じであれば、テストは成功です。

0
Dandy