Junit testování a SQLite

elvis

Junit testování a SQLite
« kdy: 14. 03. 2012, 23:52:36 »
zdravim,

co sa stane, ked mam junit, testovaciu triedu, v nej testovaciu metodu ktora vyzera takto

Kód: [Vybrat]
    @Test
    public void testCreateTool() {
try {
    SqlUtils.loadSqliteDriver();
    if (!SqlUtils.dbExists("test.db")) {
SqlUtils.deleteTables("test.db");
SqlUtils.createTables("test.db");
    }
} catch (SQLException ex) {
    Logger.getLogger(Utahovacky.class.getName()).log(Level.SEVERE, null, ex);
}
        // samotne vytvorenie testu, praca s objektami, metodami ...

a budem mat takychto metod napr. 10?

pytam sa preto, pretoze  SqlUtils.loadSqliteDriver(); je definovane ako

Kód: [Vybrat]
public class SqlUtils {

    public static void loadSqliteDriver() {
try {
    Class.forName("org.sqlite.JDBC");
} catch (ClassNotFoundException ex) {
    System.err.print(ex);
}
    }


tu som ale velmi zmateny, pretoze neviem co PRESNE robi Class.forName

ono to nacita tu org.sqlite.JDBC kniznicu pokazde ked sa spusti nejaka testovacia funkcia?

ked sa to nenacita pre kazdu, ale len pre jednu, ako mam chapat cely ten koncept Class.forName volania? to sa ulozi kam presne?

je takyto sposob v pohode? kde by sa to dalo nacitat globalne?  umiestnil som celu tu try konstrukciu kde sa loaduje tam libka do @BeforeClass metody a zda sa ze to ide ...

aka je najlepsia technika ako testovat taketo veci?

viem ze existuje DBUnit ale nechcem to na teraz robit v tom, pripada mi to ako kanon na vrabce.

diky
« Poslední změna: 15. 03. 2012, 00:14:36 od Petr Krčmář »


apoc9

Re:Junit testování a SQLite
« Odpověď #1 kdy: 15. 03. 2012, 00:59:06 »
Class.forName() vyhledá třídu podle jména. Tady se to používá, aby se vynutilo načtení třídy přes ClassLoader. Je to jeden ze způsobů jak načíst driver pro JDBC. Celá magie spočívá v tom, že driver obsahuje kód, který zajistí jeho registraci po načtení třídy do paměti (viz. Java SE - javadoc Driver, DriverManager). Jakmile se třída načte, tak už je v paměti, proto by overhead měl být největší pouze při prvním volání.
Rozhodně bych doporučoval společnou inicializaci dát do @Before nebo @BeforeClass, ať testovací metody mají jenom to důležité.

elvis

Re:Junit testování a SQLite
« Odpověď #2 kdy: 15. 03. 2012, 01:48:44 »
je mozne potom tak isto ako som tu libku "loadol" aj unloadnut? docital som sa niekde, ze jvm si tu libku drzi nacitanu kym je na nu nejaka referencia ... ako proste zaistit odloadovanie tej libky?

sice to na tento projekt nepotrebujem ale pytam sa teoreticky, je tu nejaky "unloader"?

Re:Junit testování a SQLite
« Odpověď #3 kdy: 15. 03. 2012, 05:34:54 »
Ta metoda sice zavola Class.forName("org.sqlite.JDBC");, ale nikam si si tuhle tridu neulozi (metoda forName vraci object typu Class<?>)

Imho tedy jedine co se stane po zavolani loadSqliteDriver, je ze se zkontroluje jestli dana trida existuje (na classpath).

Tuhle kontrolu je samozrejme zbytecne opakovat, takze jak doporucoval kolega prede mnou, dat ji do @BeforeClass

A vzhledem k tomu ze ji neloadujes do pameti (rovnou ji zahodis), tak ji ani nepotrebujes unloadnout. Otazka ovsem je co delaji ostatni metody (SqlUtils.deleteTables a SqlUtils.createTables)

elvis

Re:Junit testování a SQLite
« Odpověď #4 kdy: 15. 03. 2012, 08:56:01 »
jasne, chapem, robi to priblizne toto:

Kód: [Vybrat]
    public static void createTables() throws SQLException {
Connection conn = null;
Statement stat = null;

try {
    conn = DriverManager.getConnection("jdbc:sqlite:test.db");
    stat = conn.createStatement();

    stat.executeUpdate(
    "create table table1 ("
           // atd, len sa vytvori tabulka

delete metoda je podobna:
Kód: [Vybrat]
   public static void deleteTables() throws SQLException {
Connection conn = null;
Statement stat = null;

try {
    conn = DriverManager.getConnection("jdbc:sqlite:test.db");
    stat = conn.createStatement();
    stat.executeUpdate("drop table if exists table1;");
           //atd, vymazu sa tabulky

aky je rozdiel medzi tym, ked to loadnem takto a ked pridam ten jdbc driver cez "services" v netbeansoch? ked pridam ten driver tam a vynecham to loadovanie tak ten driver nenajde, ako sa tie services pouzivaju?


apoc9

Re:Junit testování a SQLite
« Odpověď #5 kdy: 15. 03. 2012, 11:21:56 »
je mozne potom tak isto ako som tu libku "loadol" aj unloadnut? docital som sa niekde, ze jvm si tu libku drzi nacitanu kym je na nu nejaka referencia ... ako proste zaistit odloadovanie tej libky?

sice to na tento projekt nepotrebujem ale pytam sa teoreticky, je tu nejaky "unloader"?
Jde o dvě rozdílné věci.
Class.forName() vrací instanci třídy Class, která reprezentuje definici třídy (je to abstrakce pro programovou reflexi), ale protože ji nikam neukládáš (instanci) tak se zahodí. Načtení třídy, tím myslím na úrovni JVM, že ClassLoader načte byte kód třídy. O to se nestaráš.
aky je rozdiel medzi tym, ked to loadnem takto a ked pridam ten jdbc driver cez "services" v netbeansoch? ked pridam ten driver tam a vynecham to loadovanie tak ten driver nenajde, ako sa tie services pouzivaju?
Nevyznám se tolik v Netbeans, ale řekl bych, že driver v Services slouží pro připojení Netbeans do databáze a prohlížení databáze přes GUI Netbeans.