Arquillian: развертывание jar и выполнение тестов против него

#java #jboss-arquillian

#java #jboss-arquillian

Вопрос:

У меня есть такой тест Арквилля:

 @Deployment
public static JavaArchive createDeployment() {
    return ShrinkWrap.create(JavaArchive.class, "ejb.jar");// ejb.jar is in a resource root  
}

@EJB
private DateService dateService;

@Test
public void shouldBeAbleToInjectEJB() throws Exception {
    Assert.assertNotNull(dateService);
}
  

Я вижу, что Arquillian создает декоратор войны и пытается развернуть его на сервере:

 19:18:34,773 WARN  [org.jboss.weld.deployer] (MSC service thread 1-5) JBAS016012: Deployment deployment "test.war" contains CDI annotations but beans.xml was not found.
19:18:34,822 INFO  [org.jboss.web] (ServerService Thread Pool -- 15) JBAS018210: Register web context: /test
19:18:35,010 INFO  [org.jboss.as.server] (management-handler-thread - 2) JBAS018559: Deployed "test.war" (runtime-name : "test.war")
19:18:35,590 INFO  [org.jboss.web] (ServerService Thread Pool -- 15) JBAS018224: Unregister web context: /test
19:18:35,617 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-8) JBAS015877: Stopped deployment test.war (runtime-name: test.war) in 30ms
  

Что не так? Почему он не был развернут немедленно?

Комментарии:

1. Он не был развернут через 0,5 секунды, может быть, этого было достаточно для запуска теста? Это ваш метод полного развертывания? В таком случае это должно завершиться неудачей.

Ответ №1:

Вы не добавили никаких ресурсов в Jar. Добавлен ejb. Является ли DateService EJB, который вы создали и хотите протестировать? Это в проекте, в рамках которого вы запускаете тест? Arquillian требует, чтобы вы добавили все необходимые ресурсы в развернутый jar.

 @Deployment
public static JavaArchive createDeployment() {
    return ShrinkWrap.create(JavaArchive.class, "ejb.jar").addClass(DateService.class);// ejb.jar is in a resource root  
}

@EJB
private DateService dateService;

@Test
public void shouldBeAbleToInjectEJB() throws Exception {
    Assert.assertNotNull(dateService);
}
  

Ответ №2:

Можно создать JavaArchive из существующего jar с помощью org.jboss.shrinkwrap.api.ShrinkWrap#createFromZipFile API. Если ваш ejb.jar файл находится в корне ресурса, тогда он должен быть разрешим несколькими способами. Что-то вроде,

 public static JavaArchive createDeployment() {
    return ShrinkWrap.createFromZipFile(JavaArchive.class, classpathFile("ejb.jar"));
}

@EJB
private DateService dateService;

@Test
public void shouldBeAbleToInjectEJB() throws Exception {
    Assert.assertNotNull(dateService);
}

private static File classpathFile(String filePathOnClasspath) {
    ClassLoader classLoader = YourTestClass.class.getClassLoader();
    URL resource = classLoader.getResource(filePathOnClasspath);
    URI fileUri = null;
    try {
        fileUri = resource.toURI();
    } catch (URISyntaxException e) {
        e.printStackTrace();
    }
    return Paths.get(fileUri).toFile();
}