10. september 2007 - 23:10Der er
17 kommentarer og 1 løsning
JUnit på en persistens mapper
Jeg har en persistensfacade, dens formål er at finde ud af hvilken mapper der skal bruges til at persister en alm. pojo.
Den virker, det kan jeg konstatere, ved at køre det og ser hvad der sker.
Men nu er det jo sådan, så det er min hovedopgave som datamatikker, og jeg og min gruppe ville meget gerne have Junit ind over, gerne med Jmock 1.2.
Problemmet er bare, at vi på skolen ikke har lært så meget om Junit, og vi kan ikke lige se, hvordan vi skal teste en mapper, hvor vi jo skal i DB og i en Identety mapper.
public class PostnrMapper implements MapperInterface {
private HashMap map;
public PostnrMapper() { map = new HashMap(); }
public boolean idFindesIdatabase(int id) throws Exception { try { ResultSet rs = DBModul.getInstance().executeQuery("SELECT count(postnr) FROM Postnr WHERE postnr = " + id); rs.next(); if (rs.getInt(1) == 1) return true; else return false; } catch (SQLException ex) { throw new Exception("fejl !! i postnr mapper."); } }
public boolean idFindesImap(int id) { return map.containsKey(new Integer(id)); }
public Object hentPostnrFraDB(int id) throws Exception { try { ResultSet rs = DBModul.getInstance().executeQuery("SELECT * FROM Postnr WHERE postnr = " + id); rs.next();
Postnr p = new Postnr(); p.setPostNr(rs.getInt("postnr")); p.setBynavn(rs.getString("bynavn"));
return p; } catch (SQLException ex) { throw new Exception("Postnr findes ikke i DB."); } }
public Object get(int id) throws Exception { if (idFindesImap(id)) { System.out.println("PostnrMapper: Henter Postnr fra HashMap"); return map.get(new Integer(id)); } else { System.out.println("PostnrMapper: Henter Postnr fra Database"); Object obj = hentPostnrFraDB(id); map.put(new Integer(id), obj); return obj; } }
public void OpretInDB(Object o ) throws Exception { Postnr p = ((Postnr)o); DBModul.getInstance().setAutoCommit(false); DBModul.getInstance().executeUpdate("INSERT INTO Postnr (postnr, bynavn) VALUES (" + p.getPostNr() + ", '" + p.getBynavn() + "')"); DBModul.getInstance().commit();
}
public void updateInDB(Object o) throws Exception { Postnr p = ((Postnr)o); DBModul.getInstance().setAutoCommit(false); DBModul.getInstance().executeUpdate("UPDATE Postnr SET bynavn = '" + p.getBynavn() + "' WHERE postnr = " + p.getPostNr()); System.err.println("PostnrMapper: UPDATE Postnr SET bynavn = '" + p.getBynavn() + "' WHERE postnr = " + p.getPostNr()); DBModul.getInstance().commit(); }
public void put(int id, Object o) throws Exception { Postnr p = ((Postnr)o); map.remove(new Integer(id)); if (!idFindesIdatabase(id)) { System.out.println("PostnrMapper: Opret Postnr i Database."); OpretInDB(o); } else { System.out.println("PostnrMapper: Update Postnr i Database."); updateInDB(o); map.put(new Integer(id), o); } }
}
Dette er bare med et alm postnr, som vi kender det, og den skal så igemmen persistenFacade, persistensfacade finder ud af, hvilken mapper, som skal bruges og sender det vidre.
Alle Mapper har et interface: som har get og put metoder i, så vi kan bruge polymorfi.
Jeg sætter denne opgave som svær, da jeg ikke har nogle ide til hordan man teste dette problem.
For lige at opsumere:
1) lave Junit test til PersistensFacade 2) meget gerne junit test til en mapper også.
Jeg håber at der kommer nogle gode forslag. Eftersom jeg ved at der er nogle ret gode folk herinde.
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Tak skal du have med inspiration, har vi lavet det hele om, samt at det bare køre derud af med test, så det må jo betyde at vi er på rette spor.
// dennis
Arne_v kom med et svar. det må man sige er på sin plads :) Men jeg vil meget gerne have nogle guldkorn, hvis det er sådan så du lige vil skrive 2 linie... hvad dine tanker er.
DBModul, har du helt ret i :) Vores persistensFacade, er slettet, den var vores store problem, og derfor vil vi nu tage det i vores kontroller klasser.
PreparedStatement: vores mapper tager sig er det, så vi behøver det ikke .. man jo, overblik :)
SQL injection vil sige at de kan tilføje noget til dit SQL statement, der kan betyde at din database bliver slettet, eller lignende ting ved f.eks. at tilføje quotes (" eller ') i tekstfelter, samt yderligere sql kommandoer.
Quotes kan generelt være et stort problem, hvis din sql hedder "update tabel set feltnavn='" + feltværdi +"'", og så feltværdi er feks "Jens Hansens' bondegård", så vil din SQL fejle, medmindre din mapper håndterer det i 100% af de mulige kombinationer.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.