サービスがセッション スコープ Bean がセッション内にあることに依存しているテスト ケースに苦労して失敗しました。
@SessionScoped User を生成するクラス:
public class LoginService {
private User user;
public void login(String name) {
if ("userA".equals(name)) {
user = new User(name, "permissionA");
} else if ("userB".equals(name)) {
user = new User(name, "permissionB");
} else {
user = new User("anonymous", "");
}
}
@Produces
@LoggedIn
@SessionScoped
public User getLoggedIn() {
return this.user;
}
}
@LoggedIn ユーザーを使用するサービス:
public class MediaService {
@Inject
@LoggedIn
private User user;
public void updateImage(){
if("permissionA".equals(user.getPermission())) {
System.out.println("user can update image");
} else {
System.out.println("user can not update image");
}
}
}
そしてテスト:
@RunWith(Arquillian.class)
public class ServiceTest {
@Deployment
public static WebArchive deployment() {
return ShrinkWrap
.create(WebArchive.class, "test.war")
.addClass(LoggedIn.class)
.addClass(LoginService.class)
.addClass(MediaService.class)
.addClass(User.class)
.addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml");
}
@Inject
private LoginService lservice;
@Inject
private MediaService mservice;
@Test
public void testLogin() {
lservice.login("userA");
}
@Test
public void testUpdateImage(){
mservice.updateImage();
}
}
arquillian リモート コンテナーを使用したテストでは、最初のテスト (testLogin) が成功し、testUpdateImage がセッション内のユーザーが null で失敗します。
WELD-000052 Cannot return null from a non-dependent producer method: [method] @Produces @LoggedIn @SessionScoped public org.arg.service.LoginService.getLoggedIn()
ありがとう