Logo Hardware.com.br
Shura16
Shura16 Ubbergeek Registrado
2.5K Mensagens 601 Curtidas

[Resolvido] Weld (CDI) + JUnit

#1 Por Shura16 26/03/2015 - 19:30
Estou estudando um projeto com Weld (CDI) usando JSF, JPA no Tomcat e até aí tudo bem.

A questão é que quando vou testar com JUnit ocorre o seguinte erro:
"Erro Tomcat"

mar 26, 2015 7:16:13 PM org.jboss.weld.bootstrap.WeldStartup <clinit>
INFO: WELD-000900: 2.2.9 (Final)
mar 26, 2015 7:16:13 PM org.jboss.weld.environment.deployment.discovery.DiscoveryStrategyFactory create
INFO: WELD-ENV-000020: Using jandex for bean discovery
mar 26, 2015 7:16:14 PM org.jboss.weld.bootstrap.WeldStartup startContainer
INFO: WELD-000101: Transactional services not available. Injection of @Inject UserTransaction not available. Transactional observers will be invoked synchronously.
mar 26, 2015 7:16:14 PM org.jboss.weld.interceptor.util.InterceptionTypeRegistry <clinit>
WARN: WELD-001700: Interceptor annotation class javax.ejb.PostActivate not found, interception based on it is not enabled
mar 26, 2015 7:16:14 PM org.jboss.weld.interceptor.util.InterceptionTypeRegistry <clinit>
WARN: WELD-001700: Interceptor annotation class javax.ejb.PrePassivate not found, interception based on it is not enabled



Segue o Teste (um exemplo simples). Se eu rodo somente o primeiro teste, funciona!:
"Teste JUnit"

[code=Java]
@RunWith(Weld4JUnitRunner.class)
public class CategoriaRepositoryTest {

@Inject
private CategoriaRepository repository;

@Test
public void testCDI() {
assertNotNull(repository);
}

@Test
public void testListByNome() {
List categoriasDB = repository.listByNome("1");

List categoriasTest = new ArrayList();

Categoria categoria1 = new Categoria();
categoria1.setId(new Long(1));
categoria1.setNome("Categoria 1");
categoriasTest.add(categoria1);

assertEquals(categoriasTest, categoriasDB);
}

}[/code]


No Repository uso:
[code=Java]
@Inject
protected EntityManager em;[/code]

"Weld4JRunner"

[code=Java]
public class Weld4JUnitRunner extends BlockJUnit4ClassRunner {

public Weld4JUnitRunner(Class<?> klass) throws InitializationError {
super(klass);
}

protected Object createTest() {
final Class<?> test = getTestClass().getJavaClass();
return WeldContext.INSTANCE.getBean(test);
}

}[/code]


"WeldContext"

[code=Java]
public class WeldContext {

public static final WeldContext INSTANCE = new WeldContext();

private final Weld weld;
private final WeldContainer container;
private final RequestContext requestContext;

private WeldContext() {
this.weld = new Weld();
this.container = weld.initialize();

this.requestContext = container.instance().select(RequestContext.class, UnboundLiteral.INSTANCE).get();
this.requestContext.activate();

Thread thread = new Thread() {
public void run() {
RequestContext requestContext = container.instance().select(RequestContext.class, UnboundLiteral.INSTANCE).get();
requestContext.activate();
}
};

thread.start();
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
this.weld.shutdown();

}

public T getBean(Class type) {
return container.instance().select(type).get();
}

}
[/code]


Já tentei alguns tutoriais na net mas nada. O que estaria faltando?
Shura16
Shura16 Ubbergeek Registrado
2.5K Mensagens 601 Curtidas
#3 Por Shura16
27/03/2015 - 11:07
A classe de teste é essa mesmo que está ali. Ainda não implementei outras coisas. Tem que rodar assim do jeito que coloquei (só não coloquei os imports).
Quando esse teste passar, parto para os próximos.

Estou usando Tomcat 8, JDK 8 e JSF 2.2
Coragem não é ausência de medo e sim o controle dele.

Linux em casa!
Windows 10, na empresa!
Agora: Android no bolso!
Shura16
Shura16 Ubbergeek Registrado
2.5K Mensagens 601 Curtidas
#5 Por Shura16
27/03/2015 - 21:58
Sinceramente não sei, mas vou tentar.
Segue meu pom.xml atual:

[code=XML]


org.jboss.weld.se
weld-se-core
2.2.9.Final
test




junit
junit
4.12
test
[/code]

------- EDIT ----------------

Mudando o pom.xml e rodando apenas o primeiro teste (que verifica se o CDI está injetando o bean) aparece o seguinte erro:

"pom.xml alterado"

[code=XML]

org.jboss.weld.se
weld-se-core
1.1.28.Final
test




junit
junit
4.8.2
test
[/code]



"Erro"


CategoriaRepositoryTest
br.com.joaocabral.locadoraweb.repository.CategoriaRepositoryTest
testCDI(br.com.joaocabral.locadoraweb.repository.CategoriaRepositoryTest)
java.lang.ExceptionInInitializerError
at br.com.joaocabral.locadoraweb.util.Weld4JUnitRunner.createTest(Weld4JUnitRunner.java:18)
at org.junit.runners.BlockJUnit4ClassRunner$1.runReflectiveCall(BlockJUnit4ClassRunner.java:258)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:255)
at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: org.jboss.weld.exceptions.IllegalStateException: WELD-001202: Error parsing file:/dados/Projetos/eclipse_jee_luna/LocadoraWeb/target/test-classes/META-INF/beans.xml
at org.jboss.weld.xml.BeansXmlParser.parse(BeansXmlParser.java:126)
at org.jboss.weld.xml.BeansXmlParser$1.apply(BeansXmlParser.java:63)
at org.jboss.weld.xml.BeansXmlParser$1.apply(BeansXmlParser.java:60)
at org.jboss.weld.xml.BeansXmlParser.merge(BeansXmlParser.java:155)
at org.jboss.weld.xml.BeansXmlParser.parse(BeansXmlParser.java:143)
at org.jboss.weld.bootstrap.WeldBootstrap.parse(WeldBootstrap.java:126)
at org.jboss.weld.bootstrap.WeldBootstrap.parse(WeldBootstrap.java:121)
at org.jboss.weld.environment.se.Weld$1.parse(Weld.java:113)
at org.jboss.weld.environment.se.discovery.url.URLScanner.scan(URLScanner.java:104)
at org.jboss.weld.environment.se.discovery.url.WeldSEUrlDeployment.<init>(WeldSEUrlDeployment.java:39)
at org.jboss.weld.environment.se.Weld.createDeployment(Weld.java:178)
at org.jboss.weld.environment.se.Weld.initialize(Weld.java:129)
at br.com.joaocabral.locadoraweb.util.WeldContext.<init>(WeldContext.java:22)
at br.com.joaocabral.locadoraweb.util.WeldContext.<clinit>(WeldContext.java:14)
... 19 more
Caused by: org.xml.sax.SAXParseException; lineNumber: 2; columnNumber: 1; Fim prematuro do arquivo.
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:441)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:368)
at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1436)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:1019)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:117)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:649)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParserImpl.java:333)
at org.jboss.weld.xml.BeansXmlParser.parse(BeansXmlParser.java:120)
... 32 more



Ele diz algo sobre o beans.xml

"beans.xml"

[code=XML]<?xml version="1.0"?>
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
bean-discovery-mode="all" >


br.com.joaocabral.locadoraweb.util.TransactionInterceptor


[/code]
Coragem não é ausência de medo e sim o controle dele.

Linux em casa!
Windows 10, na empresa!
Agora: Android no bolso!
DiguinDeveloper
DiguinDevelo... Super Participante Registrado
313 Mensagens 148 Curtidas
#6 Por DiguinDevelo...
28/03/2015 - 05:07
Bom, não conheço Weld, mas encontrei um artigo falando a respeito, segue parte 1 e parte 2

As verões não são as mesmas que você está usando, mas quem sabe pode ajudar em algo?

Inclusive possui exemplos de configuração xml, aliás é o que me irrita mais na tecnologia Java, ainda bem que estão começando a ver nas anotações uma boa alternativa.

Espero ter ajudado.
Shura16
Shura16 Ubbergeek Registrado
2.5K Mensagens 601 Curtidas
#12 Por Shura16
31/03/2015 - 19:23
Mesmo usando Wildfly (apesar de ter gostado dele), os testes não rodam.

O Wildfly usa um tal de Arquillian, mas no código gerado pelo archetype dele (wildfly) ele não funciona.

Vou utilizar uma outra forma de testes, talvez implemente testes via Web mesmo e dar este por encerrado.

Agradeço as contribuições.
Coragem não é ausência de medo e sim o controle dele.

Linux em casa!
Windows 10, na empresa!
Agora: Android no bolso!
Shura16
Shura16 Ubbergeek Registrado
2.5K Mensagens 601 Curtidas
#14 Por Shura16
01/04/2015 - 08:31
Sim, já ouvi falar nele e pretendo aprendê-lo posteriormente. Porém o Selenium não é para testes de unidade e sim testes de integração via interface gráfica.

Ele testa o programa semelhante ao que fazemos ao rodar o programa e vamos utilizando (cliques, preenchimentos etc). Ele automatiza esses processos.
Coragem não é ausência de medo e sim o controle dele.

Linux em casa!
Windows 10, na empresa!
Agora: Android no bolso!
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal