Eustáquio Rangel

Desenvolvedor, pai, metalhead, ciclista

YAML e fixtures no Java

Publicado em Developer


Esses dias precisei fazer alguns testes com o JUnit (sim, ainda trabalho com Java de maneira regular) e bateu uma saudade dos testes do Rails, especialmente dos recursos das fixtures, resolvi dar uma procurada no assunto e acabei encontrando o dbAssert, que de quebra me mostrou como utilizar YAML no Java com o JYaml. Pode até ser assunto batido para o pessoal mais punk em Java, mas para mim foi novidade, ainda mais pelo fato que nos últimos anos estou trabalhando muito mais com Ruby e Rails.

Com o JYaml ficou mais fácil armazenar algumas configurações. No site oficial tem algumas instruções para pegar resultados direto como uma classe customizada específica, mas para o que estava precisando aqui a Map já quebra um galhão. Eu precisava pegar configurações para conectar no banco de dados em um arquivo chamado data.yml, cujo conteúdo é esse:

1 mysql:
2    url: jdbc:mysql://localhost/test
3    username: test
4    password: test
5    driver: com.mysql.jdbc.Driver

Usando o JYaml, fazendo o download do .jar e inserindo-o no CLASSPATH, utilizei o seguinte código (usando import org.ho.yaml.*; antes):

14 Map data          = (Map) Yaml.load(new File("data.yml"));
15 Map mysql         = (Map) data.get("mysql");
16 String username   = (String) mysql.get("username");
17 String password   = (String) mysql.get("password");
18 String driver     = (String) mysql.get("driver");
19 String url        = (String) mysql.get("url");

Apesar de estar sem atualizações desde 2007 e haverem outras implementações de YAML em Java por aí, gostei do JYaml, ele atende minhas expectativas de forma simples.

Partindo agora para as fixtures, levando em conta uma classe chamada Customers (não mostrada aqui) para agir como um ORM bem simples, um arquivo de testes para o JUnit chamado TestCustomer.java e um minúsculo arquivo YAML chamado customers.yml com o seguinte conteúdo:

1 one:
2    id: 1
3    name: Antonio

Escrevi os testes da seguinte maneira, mostrando aqui o TestCustomer.java:

 1 import java.io.*;
 2 import java.util.*;
 3 import junit.framework.*;
 4 import junit.extensions.*;
 5 import net.codemate.*;
 6 import org.ho.yaml.*;
 7 
 8 public class TestCustomer extends TestCase {
 9    private static DbAssert       dbAssert;
10    private static DbSource       dbSource;
11    private static Fixture        cust_fix;
12    private static Customers      customers;
13 
14    public TestCustomer(String name){
15       super(name);
16    }
17 
18    public static void testFixturesLoaded(){
19       dbAssert.table("customers").where("id",1);
20       dbAssert.assert_not_empty("name");
21       dbAssert.assert_column("name","Antonio");
22       dbAssert.assert_count(1);
23    }
24 
25    public static void testFirstCustomer() throws java.sql.SQLException {
26       Fixture first = (Fixture) cust_fix.get("one");
27       assertEquals(first.get("id"),1);
28       assertEquals(first.get("name"),"Antonio");
29 
30       Customer c = customers.get(0);
31       assertEquals(c.getId(),first.get("id"));
32       assertEquals(c.getName(),first.get("name"));
33    }
34 
35    public static void testAddCustomer() throws java.sql.SQLException {
36       int size = customers.size();
37       Customer c = customers.add(2,"Antonia");
38       dbAssert.table("customers");
39       dbAssert.assert_count(2);
40       assertEquals(size+1,customers.size());
41    }
42 
43    public static Test suite(){
44       TestSuite suite = new TestSuite();
45       suite.addTest(new TestCustomer("testFixturesLoaded"));
46       suite.addTest(new TestCustomer("testFirstCustomer"));
47       suite.addTest(new TestCustomer("testAddCustomer"));
48 
49       TestSetup wrapper = new TestSetup(suite){
50          protected void setUp(){
51             try {
52                dbAssert    = DbAssert.init("data.yml");
53                dbSource    = dbAssert.source("mysql");
54                cust_fix    = dbSource.fixture("fixtures/customers.yml");
55                customers   = new Customers();
56             }catch(Exception e){
57                System.err.println("setup error: "+e.getMessage());
58             }
59          }
60          protected void tearDown(){
61             dbSource.clean_table("customers");
62          }
63       };
64       return wrapper;
65    }
66 }

Agora dando uma dissecada no bicho:

Existem mais algumas outras assertions na página do dbAssert, que apesar de simples é um software que está me quebrando um bom galho nos testes que estou fazendo atualmente no Java. Deixando claro que o código dos exemplos, como sempre nos posts, são orientados à didática e exposição da ferramenta. Quem precisar de funcionalidade e gostou, divirta-se! :-)




Comentários

Comentários fechados.

Artigos anteriores