2

サービスがセッション スコープ 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()

ありがとう

4

0 に答える 0