2016-04-29 7 views
4

При запуске maven с параметрами теста я получаю вышеупомянутое исключение. При создании развертывания тестовой интеграции, я получаю следующее:Не удалось обработать бизнес-интерфейсы для класса EJB

org.jboss.as.server.deployment.DeploymentUnitProcessingException: WFLYEJB0466: Failed to process business interfaces for EJB class class ..contract.ContractMockService 

относительно класса выглядит следующим образом:

package ..integration.bestand.contract; 

import java.time.LocalDate; 
import java.util.ArrayList; 

import javax.ejb.Local; 
import javax.ejb.Stateless; 

import org.apache.deltaspike.core.api.exclude.Exclude; 
import org.apache.deltaspike.core.api.projectstage.ProjectStage; 

... 

@Exclude(ifProjectStage = { 
    ProjectStage.Production.class, 
    ProjectStage.Staging.class, 
    ..Integration.class, 
    ..Qs.class, 
    ..PatchQs.class 
}) 
@Stateless 
@Local(IContractIntService.class) 
public class ContractMockService implements IContractIntService { 

    ... 

    return ContractBuilder.build(); 
    } 

} 

Интерфейс IContractIntService выглядит следующим образом:

package ..integration.bestand.contract; 

import javax.ejb.Local; 

... 

@Local 
public interface IContractIntService { 

    public enum State { 
    SUCCESS, 
    UNKNOWN_ERROR, 
    NOT_FOUND; 
    // TODO: Stati für Fehler hier definieren 
    } 

    //Interface comment 
    Result<State, ContractDTO> retrieveContract(String contractIdentifier); 
} 

Примечание: Интерфейс находится в другом проекте, который включен через maven.

Тест выглядит следующим образом:

package ..api.contractregistration.service; 

import static org.hamcrest.CoreMatchers.any; 
import static org.hamcrest.MatcherAssert.assertThat; 

import java.util.logging.Logger; 

import org.jboss.arquillian.container.test.api.Deployment; 
import org.jboss.arquillian.junit.Arquillian; 
import org.jboss.shrinkwrap.api.ShrinkWrap; 
import org.jboss.shrinkwrap.api.asset.EmptyAsset; 
import org.jboss.shrinkwrap.api.spec.WebArchive; 
import org.junit.Rule; 
import org.junit.Test; 
import org.junit.experimental.categories.Category; 
import org.junit.rules.TestWatcher; 
import org.junit.runner.RunWith; 

import ..core.test.IntegrationTest; 

@RunWith(Arquillian.class) 
@Category(IntegrationTest.class) 
public class ContractRegistrationIntegrationTest { 

    protected final Logger log = Logger.getLogger(ContractRegistrationIntegrationTest.class.getCanonicalName()); 

    @Rule 
    public TestWatcher watcher = new TestWatcher() { 

    @Override 
    protected void starting(org.junit.runner.Description description) { 
     log.info(String.format("---> Starting test: %s", description)); 
    } 

    @Override 
    protected void failed(Throwable e, org.junit.runner.Description description) { 
     log.info(String.format("<--- Test failed: %s", description)); 
    } 

    @Override 
    protected void succeeded(org.junit.runner.Description description) { 
     log.info(String.format("<--- Test succeeded: %s", description)); 
    } 
    }; 

    @Deployment 
    public static WebArchive createDeployment() { 
    WebArchive result = ShrinkWrap.create(WebArchive.class) 
     .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml") 
     .addAsResource("META-INF/persistence.xml", "META-INF/persistence.xml") 
     .addPackages(true, "..ejb.portal") 
     .addPackages(true, "..core") 
     .deletePackages(true, "..core.config.deltaspike") 
     .addPackages(true, "..integration") 
     .addPackages(true, "..api") 
     .addPackages(true, "org.apache.deltaspike.core") 
     .addPackages(true, "..ejb.util"); 
    System.out.println("########## TEST DEPLOYMENT########" + result.toString(true)); 

    return result; 
    } 

    @Test 
    public void test() { 
    String tempPw = "bla"; // result.getDto(); 
    assertThat(tempPw, any(String.class)); 
    } 

} 

Замечательная вещь об этом тесте, что я даже не использовать что-либо из MockService внутри теста.

конфигурации

The Maven выглядит следующим образом:

Цели: clean test -Parq-wildfly-managed JRE VM Аргументы: -Djboss.home="myLocalWildflyDirectory"

JAVA_HOME установлен в jdk8.

Последняя вещь мой ПОМ, в частности, часть контейнера «АЗП-wildfly-управляемый»:

... 

     <profile> 
      <!-- An optional Arquillian testing profile that executes tests in your WildFly instance, e.g. for build server --> 
      <!-- This profile will start a new WildFly instance, and execute the test, shutting it down when done --> 
      <!-- Run with: mvn clean test -Parq-wildfly-managed --> 
      <id>arq-wildfly-managed</id> 
      <dependencies> 
       <dependency> 
        <groupId>org.wildfly.arquillian</groupId> 
        <artifactId>wildfly-arquillian-container-managed</artifactId> 
        <scope>test</scope> 
       </dependency> 

       <dependency> 
        <groupId>de.ivi.torino</groupId> 
        <artifactId>torino-integration-bestand-mock-ejb</artifactId> 
        <version>1.0.0-SNAPSHOT</version> 
        <scope>test</scope> 
       </dependency> 

       <dependency> 
        <groupId>de.ivi.torino</groupId> 
        <artifactId>torino-integration-docservice-mock-ejb</artifactId> 
        <version>1.0.0-SNAPSHOT</version> 
        <scope>test</scope> 
       </dependency>  
       <dependency> 
        <groupId>de.ivi.torino</groupId> 
        <artifactId>torino-integration-bestand-api</artifactId> 
        <version>1.0.0-SNAPSHOT</version> 
       </dependency>   

      </dependencies> 
     </profile> 
... 

Нормальный специалист строить с clean verify package install (только ни один тест не входит в комплект) строит успешно.

Примечание: для этого сообщения я переименовал пакеты, чтобы исключить специализации компании.

Подобные ошибки предполагают исправление развертывания ShrinkWrap, но я включил практически все пакеты и даже попытался явно включить интерфейс-класс. Но тем не менее такая же ошибка сохраняется.

Что может быть причиной этого?

+0

Возможно, вы неправильно поняли жизненный цикл maven. Если вы вызываете maven через 'mvn clean check package install', чем несколько вещей работают двойными или тройными. То, что вам просто нужно: 'mvn clean install' или' mvn clean verify'..Recommend читать https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html – khmarbaise

+0

@khmarbaise спасибо за ваше предложение. Я могу ясно сказать, что я не эксперт с maven. Раньше я использовал ваши упомянутые сценарии запуска, и они работали, но мой вопрос не был нацелен на рабочие сборки. Строка 'test' выдает вышеупомянутую ошибку и оставляет меня бессвязным ... – EngJon

+0

Возможно, ваш IContractService не может быть загружен из-за отсутствия зависимостей. Вы можете проверить свой журнал под категорией org.jboss.weld.Bootstrap на уровне INFO, чтобы убедиться, что все ваши определения beans правильно зарегистрированы. – Franck

ответ

0

Попробуйте это в Test (Упаковочная):

.addAsResource(new StringAsset("org.apache.deltaspike.ProjectStage=IntegrationTest"), "META-INF/apache-deltaspike.properties") 

и изменить свой Исключите на это:

@Exclude(exceptIfProjectStage = ProjectStage.IntegrationTest.class) 

Если вам необходимо исключить дополнительные этапы, добавить их к этому очень исключить заявление

+1

Это сделало трюк! Я включил исключение и для своего продюсера, который также решил другие проблемы. – EngJon

+0

Поскольку я не хочу, чтобы моя щедрость истекала, этот ответ кажется подходящим, хотя он мог бы получить более подробную информацию о том, почему это исключение не сработало, но эй, это сработало;) – EngJon

0

Немного поздно, но лучшим решением проблемы было следующее:

Внутри развертывания ShrinkWrap требуется использование разрешающего устройства с уклоном. Таким образом, вместо

.addPackages(true, "org.apache.deltaspike.core") 

внутри создания result, используйте Maven распознаватель.Должен выглядеть примерно так:

ShrinkWrap 
    .create(WebArchive.class, "test.war") 
    .addAsLibraries(
     resolver.artifact("org.apache.deltaspike.core") 
    .resolveAsFiles()); 

Артефакт - это артефакт maven. это вернет другой .war. многократные .wars (созданные из резольвера или то, как вы видите в исходном вопросе) могут быть объединены. Этот объединенный .war затем должен быть возвращен из метода развертывания.

Причина этого: Внешние компоненты включают в себя (в данном случае deltaspike) ресурсы, которые вы импортируете через ShrinkWrap.create.*.addAsPackages.., поэтому их следует использовать только для внутренних пакетов проекта. Чтобы использовать Maven распознаватель, вы можете включать в себя следующее в .pom-файле:

<dependency> 
<groupId>org.jboss.shrinkwrap.resolver</groupId> 
<artifactId>shrinkwrap-resolver-impl-maven</artifactId> 
<scope>test</scope> 
</dependency> 

кредиты dzone.com для фрагментов кода Maven разрешителя. В настоящее время я работаю над другим проектом, поэтому я не могу показать оригинальный код, но он был очень похож на этот.

Возможно, это решение поможет кому-то в будущем.