[Resolvido] FJ-16 Dúvida - Testes com JUnit-XML

7 respostas
andersouza

Estou acompanhando a apostila FJ-16 da Caelum para me aprofundar em alguns conceitos
mas parei em alguns exercicios onde se usa o JUnit para testar a leitura de XML

Tudo estava ótimo até rodar o teste e aparecer varios erros
são esses:

com.thoughtworks.xstream.mapper.CannotResolveClassException: List
at com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:56)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.DynamicProxyMapper.realClass(DynamicProxyMapper.java:55)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.PackageAliasingMapper.realClass(PackageAliasingMapper.java:88)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.ClassAliasingMapper.realClass(ClassAliasingMapper.java:79)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.ArrayMapper.realClass(ArrayMapper.java:74)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.CachingMapper.realClass(CachingMapper.java:45)
at com.thoughtworks.xstream.core.util.HierarchicalStreams.readClassType(HierarchicalStreams.java:29)
at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:133)
at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:32)
at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1052)
at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1036)
at com.thoughtworks.xstream.XStream.fromXML(XStream.java:912)
at reader.LeitorXML.carrega(LeitorXML.java:15)
at reader.LeitorXMLTest.testLeitorDeXmlCarregaListaNegocio(LeitorXMLTest.java:20)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
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:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

Pelo que percebi o erro principal é na classe LeitorXML ou pelo menos assim me parece

segue a classe LeitorXML:
public class LeitorXML {
	public List<Negocio> carrega(Reader fonte) {
		XStream stream = new XStream(new DomDriver());
		stream.alias("negocio", Negocio.class);
		List<Negocio> lista = (List<Negocio>) stream.fromXML(fonte);
		return lista;
	}
}
a classe de teste:
public class LeitorXMLTest {

	@Test
	public void testLeitorDeXmlCarregaListaNegocio() {
		String xmlDeTeste = "<List><negocio><preco>43.5</preco><quantidade>1000</quantidade><data><time>555454646</time></data></negocio></List>";

		LeitorXML leitor = new LeitorXML();
		List<Negocio> negocios = leitor.carrega(new StringReader(xmlDeTeste));

		Assert.assertEquals(1, negocios.size());
	}
}

O próprio Eclipse mostra um aviso na linha 5 da LeitorXML
mas não tenho a mínima idéia do que pode estar acontecendo.
Se alguém puder ajudar...

7 Respostas

romarcio

Acho que seu XML está errado, deveria ser: &lt;negocio&gt;&lt;preco&gt;43.5&lt;/preco&gt;&lt;quantidade&gt;1000&lt;/quantidade&gt;&lt;data&gt;&lt;time&gt;555454646&lt;/time&gt;&lt;/data&gt;&lt;/negocio&gt; E também acho que deveria ter a tag: &lt;?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-1&quot;?&gt; no inicio do xml.

ribclauport

Rapaiz usei o código abaixo e rodou bonitinho, acredito que é por causa do "List", pois você usou maiusculo eu troquei para maisculo e não funcionou, cola a classe
que coloquei ae abaixo! depois diga se deu certo!

import java.io.StringReader;
import java.util.List;

import junit.framework.Assert;

import org.junit.Test;

public class LeitorXMLTest {  

    @Test  
    public void testLeitorDeXmlCarregaListaNegocio() {  
    	String xmlDeTeste = "&lt;list&gt;&lt;negocio&gt;&lt;preco&gt;43.5&lt;/preco&gt;&lt;quantidade&gt;1000&lt;/quantidade&gt;&lt;data&gt;&lt;time&gt;555454646&lt;/time&gt;&lt;/data&gt;&lt;/negocio&gt;&lt;/list&gt;"; // o XML vai aqui!
		LeitorXML leitor = new LeitorXML();
		List&lt;Negocio&gt; negocios = leitor.carrega(new StringReader(xmlDeTeste));
		System.out.println(negocios.size());

        Assert.assertEquals(1, negocios.size());  
    }  
}
andersouza

O problema era o L maiúsculo mesmo,
caramba, que coisa simples.

Mas porque o L maiúsculo acarreta um erro?

ribclauport

Bom, decompilei o fonte aqui segue o codigo abaixo:

Em algum momento é chamado o construtor que chama um método que "dá" apelidos para as classes, veja:

public XStream(ReflectionProvider reflectionProvider, HierarchicalStreamDriver driver, ClassLoader classLoader, Mapper mapper, ConverterLookup converterLookup, ConverterRegistry converterRegistry)
  {
    this.jvm = new JVM();

    this.jvm = new JVM();
    if (reflectionProvider == null)
      reflectionProvider = this.jvm.bestReflectionProvider();

    this.reflectionProvider = reflectionProvider;
    this.hierarchicalStreamDriver = driver;
    this.classLoaderReference = new ClassLoaderReference(classLoader);

    this.converterLookup = converterLookup;
    this.converterRegistry = ((converterLookup instanceof ConverterRegistry) ? (ConverterRegistry)converterLookup : (converterRegistry != null) ? converterRegistry : null);

    this.mapper = ((mapper == null) ? buildMapper() : mapper);

    setupMappers();
    setupAliases();
    setupDefaultImplementations();
    setupConverters();
    setupImmutableTypes();
    setMode(1003);
  }

aqui está o fonte do método:

protected void setupAliases()
  {
    if (this.classAliasingMapper == null) {
      return;
    }

    alias("null", Mapper.Null.class);
    alias("int", Integer.class);
    alias("float", Float.class);
    alias("double", Double.class);
    alias("long", Long.class);
    alias("short", Short.class);
    alias("char", Character.class);
    alias("byte", Byte.class);
    alias("boolean", Boolean.class);
    alias("number", Number.class);
    alias("object", Object.class);
    alias("big-int", BigInteger.class);
    alias("big-decimal", BigDecimal.class);

    alias("string-buffer", StringBuffer.class);
    alias("string", String.class);
    alias("java-class", Class.class);
    alias("method", Method.class);
    alias("constructor", Constructor.class);
    alias("field", Field.class);
    alias("date", Date.class);
    alias("uri", URI.class);
    alias("url", URL.class);
    alias("bit-set", BitSet.class);

    alias("map", Map.class);
    alias("entry", Map.Entry.class);
    alias("properties", Properties.class);
    alias("list", List.class);
    alias("set", Set.class);
    alias("sorted-set", SortedSet.class);

    alias("linked-list", LinkedList.class);
    alias("vector", Vector.class);
    alias("tree-map", TreeMap.class);
    alias("tree-set", TreeSet.class);
    alias("hashtable", Hashtable.class);

    alias("empty-list", Collections.EMPTY_LIST.getClass());
    alias("empty-map", Collections.EMPTY_MAP.getClass());
    alias("empty-set", Collections.EMPTY_SET.getClass());
    alias("singleton-list", Collections.singletonList(this).getClass());
    alias("singleton-map", Collections.singletonMap(this, null).getClass());
    alias("singleton-set", Collections.singleton(this).getClass());

    if (this.jvm.supportsAWT())
    {
      alias("awt-color", this.jvm.loadClass("java.awt.Color"));
      alias("awt-font", this.jvm.loadClass("java.awt.Font"));
      alias("awt-text-attribute", this.jvm.loadClass("java.awt.font.TextAttribute"));
    }

    if (this.jvm.supportsSQL()) {
      alias("sql-timestamp", this.jvm.loadClass("java.sql.Timestamp"));
      alias("sql-time", this.jvm.loadClass("java.sql.Time"));
      alias("sql-date", this.jvm.loadClass("java.sql.Date"));
    }

    alias("file", File.class);
    alias("locale", Locale.class);
    alias("gregorian-calendar", Calendar.class);

    if (JVM.is14()) {
      aliasDynamically("auth-subject", "javax.security.auth.Subject");
      alias("linked-hash-map", this.jvm.loadClass("java.util.LinkedHashMap"));
      alias("linked-hash-set", this.jvm.loadClass("java.util.LinkedHashSet"));
      alias("trace", this.jvm.loadClass("java.lang.StackTraceElement"));
      alias("currency", this.jvm.loadClass("java.util.Currency"));
      aliasType("charset", this.jvm.loadClass("java.nio.charset.Charset"));
    }

    if (JVM.is15()) {
      aliasDynamically("duration", "javax.xml.datatype.Duration");
      alias("enum-set", this.jvm.loadClass("java.util.EnumSet"));
      alias("enum-map", this.jvm.loadClass("java.util.EnumMap"));
      alias("string-builder", this.jvm.loadClass("java.lang.StringBuilder"));
      alias("uuid", this.jvm.loadClass("java.util.UUID"));
    }
  }

Como pode observar existe essa linha:

alias("list", List.class);

Espero ter ajudado.

andersouza

Agora entendi
vlw mesmo hein
vai me ajudar bastante daqui pra frente

Erik007

Bom dia Andersouza.
Gostaria de me aprofundar no JAVA pela apostila fj-16.
Vc possui um link com a apostila? :?:

andersouza

Erik

a apostila fj-16 só esta disponível para alulnos e ex-alunos
se eu dizponibiliza-se ela pra vc estaria infringindo as regras da empresa
e como o próprio GUJ é da Caelum, eu não sou nem doido de fazer isso

tem várias apostilas na internet que tratam o mesmo assunto que o fj-16
da uma pesquisada que até aqui no GUJ tem material

Criado 8 de março de 2012
Ultima resposta 14 de mar. de 2012
Respostas 7
Participantes 4