MyResource
作成および破棄できるシングルトン リソースを使用するテストを実行したいと考えています。リソースは、コマンド ライン経由で制御される、同じマシン上で実行中の別のプログラムを表しRuntime.exec
ます。プログラムは明示的に開始およびシャットダウンする必要があるため、MyResource.establishConnection
2 回呼び出すと失敗します。呼び出しに失敗するとMyResource.shutDown
、Java プログラムが終了した後でもアプリケーションが開いたままになります。ここで、リソースが起動後に使用できるかどうかを確認するテスト ケースを作成したいと考えています。(起動とシャットダウンは別の場所でテストされています。) 私が書いたテスト ケースは次のようになります。
private MyResource myResource;
@BeforeMethod(firstTimeOnly = true)
public void setUp() throws Exception {
myResource = new MyResource();
myResource.establishConnection();
}
@AfterMethod(lastTimeOnly = true)
public void tearDown() throws Exception {
myResource.shutDown();
}
@Test(invocationCount = 30, threadPoolSize = 5)
public void testMethod() throws Exception {
myResource.use():
}
このテストの目的の 1 つは、リソース ( MyResource
) が同時にアクセスされたときに正常に動作するかどうかを確認することです。ただし、 で注釈が付けられたメソッドが、@BeforeMethod
1 回だけではなく 3 回 (スレッドごとに 1 回) 呼び出されることがわかりました。は正の sfirstTimeOnly
には当てはまらないようです。threadPoolSize
これを修正できますか? @BeforeTest
(このテストクラスには、他のテストメソッドによって表される他のテストがあります。これが、たとえばアプリケーションがメソッド間で再起動されるようなものを使用したくない理由です。)
助けてくれてありがとう。
更新:さらなる謎。このコード スニペット
@BeforeMethod(firstTimeOnly = true)
public void setUp() throws Exception {
LOGGER.info("Set up");
}
@AfterMethod(lastTimeOnly = true)
public void tearDown() throws Exception {
LOGGER.info("Tear down");
}
@Test(invocationCount = 10)
public void testName() throws Exception {
LOGGER.info("Running test");
}
印刷されます:
設定
ランニングテスト
取り壊す
ランニングテスト
ランニングテスト
ランニングテスト
ランニングテスト
ランニングテスト
ランニングテスト
ランニングテスト
ランニングテスト
ランニングテスト
setUp
そのため、上記のように 3 回呼び出されるだけでtearDown
なく、設定しなくても呼び出されるのが早すぎますthreadPoolSize
。@AfterMethod
これは、次のlastTimeOnly
ように述べているの javadoc とは対照的です。
true で、実行されたばかりの @Test メソッドの invocationCount > 1 の場合、この AfterMethod は 1 回だけ呼び出されます (最後のテスト呼び出しの後)。