私は Arquillian に頭を悩ませようとしており、おそらく自分のプロジェクトでそれを使い始めようとしています。Tomcat に WAR としてデプロイする単純な Java Web アプリがあります。
私のプロジェクトでは、ServletContextListener
Tomcat がアプリケーションを開始および停止するときにコードを実行できるように impl を定義しています。
ShrinkWrap を使用する超単純なArquillian テスト クラスを作成しようとしています。
- バンドルされた WAR を Tomcat にデプロイして、例外をスローすることなく開始できることを確認します。と
- アプリが実行されたら ( が
ServletContextListener
チェックする) シンプルなシステム プロパティにアクセスできます。と - Tomcat のシャットダウン時に例外がスローされないことを確認します (クリーン シャットダウン)。
また、実装する私のクラスは次のServletContextListener
ように呼ばれAppLifecycleManager
ます:
public class AppLifeCycleManager implements ServletContextListener {
private String logLevel;
// Injected by Guice, but that's not really relevant for this question.
@Inject
private Logger logger;
// Getter and setter for logLevel and logger
@Override
public void contextInitialized(ServletContextEvent event) {
logLevel = System.getProperty("log.level");
}
@Override
public void contextDestroyed(ServletContextEvent event) {
logger.info("Peacefully shutting down the application.");
}
}
これまでのところ、これが私の最善の試みです:
@RunWith(Arquillian.class)
public class MyFirstRealIntegrationTest {
@Deployment
public static Archive<?> createDeployment() {
// Haven't figured this part out yet, but for the sake of
// this question lets pretend this returns a properly-packaged
// WAR of my web app, the same that my Ant build currently produces.
}
@Test
public void shouldBeAbleToStartTomcatWithoutExceptions() {
// Given
Archive war = createDeployment();
// When - deploy war to Tomcat container
try {
// ??? how to access/init a Tomcat container?
TomcatContainer tomcat = new TomcatContainer(); // this is wrong
tomcat.start();
} catch(Throwable throwable) {
// Starting the container should not throw exceptions
Assert.fail();
}
}
@Test
public void shouldBeAbleToStopTomcatWithoutExceptions {
// Same setup as above test but stops tomcat and checks for
// thrown exceptions. Omitted for brevity.
}
@Test
public void shouldHaveAccessToSysPropsOnceRunning() {
// Here, deploy to the container and start it.
// Then, confirm that AppLifecycleManager correctly read
// the log.level system property.
// Given
Archive war = createDeployment();
TomcatContainer tomcat = new TomcatContainer();
// When - AppLifeycleManager should now read the system property
tomcat.start();
// Then - make sure log.level was set to "DEBUG" and that it was
// correctly read by AppLifeCycleManager.
Assert.assertTrue(war.getClass(AppLifeCycleManager.class)
.getLogLevel().equals("DEBUG"));
}
}
したがって、ここでの私のアプローチを考えると、すぐにいくつかの問題が発生します。
- Tomcat コンテナーにアクセス/インスタンス化して、開始/停止する方法がわからない
- 実行中/デプロイ済みの Web アプリ内から実際にテストを実行する方法がわかりません。上記の 3 番目のテスト
war.getClass(AppLifeCycleManager.class).getLogLevel()
では、「ライブ」クラス インスタンスにアクセスしてそのプロパティのランタイム値をチェックしようとしましたlogLevel
が、これが間違っていることはわかっています。
そこで私は質問します: 戦いに慣れた Arquillian のベテランはどのようにこれら 3 つの簡単なテストを作成するのでしょうか? JUnit テスト内から「実行中の」Web アプリで実際にテストを実行するにはどうすればよいでしょうか? 前もって感謝します。