以下代码将解决上述问题。我希望它对其他使用遗留应用程序的开发人员有用。
@RunWith(Arquillian.class)
@ArquillianSuiteDeployment
public class seamIntegrationTest {
private AssetAction assetAction;
private EntityManager entityManager;
private User user;
@Deployment
public static Archive<?> createTestArchive() {
MavenResolverSystem resolver = Maven.resolver();
resolver.loadPomFromFile("pom.xml");
return ShrinkWrap.create(WebArchive.class, "my.war")
.addPackages(true, "de.abc.ui")
.addPackages(true, "de.abc")
.addAsResource("META-INF/test-persistence.xml", "META-INF/persistence.xml")
.addAsResource("META-INF/jboss-deployment-structure.xml", "META-INF/jboss-deployment-structure.xml")
.addAsResource("META-INF/jaxws-endpoint-config.xml", "META-INF/jaxws-endpoint-config.xml")
.addAsResource("META-INF/jboss-webservices.xml", "META-INF/jboss-webservices.xml")
.addAsResource("de/abc/tool/webservice/handler/ws_security_handler.xml")
.addAsResource("components.properties")
.addAsResource("security.drl")
.addAsResource(EmptyAsset.INSTANCE, "seam.properties")
.addAsWebInfResource("components.xml")
.setWebXML("web.xml")
.addAsLibraries(
resolver.loadPomFromFile("pom.xml").importRuntimeAndTestDependencies().resolve().withTransitivity().asFile());
}
@Before
public void setUp() throws Exception {
MockFacesContext mfc = new MockFacesContext(new MockExternalContext(), new MockApplication());
UIViewRoot viewRoot = mock(UIViewRoot.class);
when(viewRoot.findComponent(anyString())).thenReturn(mock(UIForm.class));
mfc.setViewRoot(viewRoot);
Method m = ReflectionUtils.findMethod(FacesContext.class, "setCurrentInstance", FacesContext.class);
m.setAccessible(true);
m.invoke(null, mfc);
Credentials credentials = new Credentials();
credentials.setUsername("user");
credentials.setPassword("password");// these should be an existing user in the database
credentials.setInitialized(true);
Principal principal = new Principal() {
@Override
public String getName() {
return "principalname";
}
};
ExtendedIdentity identity = new ExtendedIdentity();
identity.create();
Field c = ReflectionUtils.findField(ExtendedIdentity.class, "credentials");
c.setAccessible(true);
ReflectionUtils.setField(c, identity, credentials);
c = ReflectionUtils.findField(ExtendedIdentity.class, "principal");
c.setAccessible(true);
ReflectionUtils.setField(c, identity, principal);
identity.login();
Contexts.getSessionContext().set(Component.getComponentName(Identity.class), identity);
List<User> users = entityManager.createNamedQuery(User.Q_getUserByUserName)
.setParameter("username", "password")
.getResultList();
if (!users.isEmpty()) {
user = users.get(0);
Contexts.getSessionContext().set("loginUser", user);
for (Role role : user.getRoles()) {
identity.addRole(role.getRolename());
}
}
}
// This is the dialog that can only be accessed when a user is successfully logged in:
@Test
public void openCreateNewDialog() throws Exception {
assetAction.setAssetId(126);
assetAction.setAsset(entityManager.find(Asset.class, 126));
assetAction.openNewChildAssetDialog();
String result = assetAction.saveNewChildAsset();
}
}