Java の認証フレームワーク Apache Shiro と テスティングフレームワークの Arquillian を組み合わせたテストに関して、Github にサンプルが上がっていたのでメモ。
ポイントは以下のようなクラスを用意するところです。
SecurityFacade
@Singleton
public class SecurityFacade {
Logger logger = LoggerFactory.getLogger(SecurityFacade.class);
private SecurityManager securityManager;
@PostConstruct
public void init() {
final String iniFile = "classpath:shiro.ini";
logger.info("Initializing Shiro INI SecurityManager using " + iniFile);
securityManager = new IniSecurityManagerFactory(iniFile).getInstance();
SecurityUtils.setSecurityManager(securityManager);
}
/*
* テストケースでインジェクションできるように、subject という名前で Produces
*/
@Produces
@Named("subject")
public Subject getSubject() {
return SecurityUtils.getSubject();
}
}
テストケースはこんな感じ。
SecurityTest
@RunWith(Arquillian.class)
public class SecurityTest {
/*
* 必要なクラスや設定ファイル(beans.xml等)をデプロイ
*/
@Deployment
public static WebArchive deployment() {
return RESTDeployment.deployment();
}
/*
* subject をインジェクション
*/
@Inject
private Subject subject;
/**
* ユーザ認証が必要なテスト
*/
@Test
public void should_test_after_loggedIn() {
subject.login(new UsernamePasswordToken("test1", "test1"));
// 以降、テストの中身
}
}
サンプルでは、インターセプター等も利用しているので他の面も参考になります。