Java 测试驱动开发在数据库中的应用

Java 测试驱动开发在数据库中的应用,java,android,database,unit-testing,tdd,Java,Android,Database,Unit Testing,Tdd,我有这个密码: 这是一个能够插入、删除和修改Contactos的简单数据库。 我需要使用测试驱动开发来创建这个类 package com.example.informacion; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteConstraintException

我有这个密码:

这是一个能够插入、删除和修改Contactos的简单数据库。 我需要使用测试驱动开发来创建这个类

package com.example.informacion;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteConstraintException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

import java.util.ArrayList;

public class BaseDatosContactos extends SQLiteOpenHelper {
    /* 
     NOMBRE_BASEDATOS: sera el nombre de nuestro archivo de base de datos
     VERSION_BASEDATOS: la versión de nuestra base de datos
     TABLA_CONTACTOS: un string que contiene una sentencia SQL para la creación de una tabla llamada contactos. Lo que tenemos en 
                      parentesis son las columnas, un índice INT primario (no es obligatorio pero si muy recomendable para 
                      no tener problemas a la hora de insertar, modificar o borrar alguna fila ya que es un valor único) */

private static final int VERSION_BASEDATOS = 4;

// Nombre de nuestro archivo de base de datos
private static final String NOMBRE_BASEDATOS = "contactos.db";

// Sentencia SQL para la creación de una tabla
private static final String TABLA = "contactos";
private static final String CREAR_TABLA = "CREATE TABLE " + TABLA 
        + "(nombre TEXT, direccion TEXT, telefono TEXT,email TEXT PRIMARY KEY UNIQUE NOT NULL,miembrofacebook INT, miembrotwitter INT, miembrogoogle INT, miembrolinkedin INT, sexo INT, tipocontacto TEXT, imagen INT)";

private static final String TAG ="BaseDatosContactos";

/*  La clase ContactoAgenda que quiero almacenar es:
private String Nombre;
private String Direccion;
private String Telefono;
private String mail;

//Cambio boolean por int ya que no va bien en las bases de datos, true=1, false=0
private int miembroFacebook;
private int miembroTwitter;
private int miembroGoogle;
private int miembroLinnkedin;
private int sexo;
private String tipoContacto;
private int drawableImageID; */

public BaseDatosContactos(Context context) {
    super(context, NOMBRE_BASEDATOS, null, VERSION_BASEDATOS);
}

@Override
public void onCreate(SQLiteDatabase db) {
    // TODO Auto-generated method stub
    db.execSQL(CREAR_TABLA); //db.execSQL(TABLA_CONTACTOS);
    //addContacto(new contactoAgenda("Belen", "c/ Diego Madrazo","1", "belen@gmail.com",true, true, false, false, false,"Familia", R.drawable.hulk));
    //Inicializo la base de datos con algun contacto

    insertarContacto(db,"Belen", "c/ Diego Madrazo","1", "belen@gmail.com",1, 1, 0, 0, 0,"Familia", R.drawable.hulk);
    insertarContacto(db, "Daniel", "c/ Diego Madrazo","2", "daniel@gmail.com",0, 0, 0, 0, 1,"Laboral", R.drawable.spidey);
    insertarContacto(db, "Eduardo", "c/ Segovia","973269128", "eduardo@gmail.com",0, 0, 0, 1, 1,"Amigo", R.drawable.ironman);
    insertarContacto(db,"Asuncion", "c/ Paseo de Ronda","92458", "mama@msn.com",1, 1, 1, 0, 0,"Laboral", R.drawable.thor);

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // TODO Auto-generated method stub
    // db.execSQL("DROP TABLE IF EXISTS " + TABLA_CONTACTOS);
    db.execSQL("DROP TABLE IF EXISTS " + TABLA);
    onCreate(db);
    //  insertarContacto("Belen", "c/ Diego Madrazo","1", "belen@gmail.com",1, 1, 0, 0, 0,"Familia", R.drawable.hulk);

}
/*
Creamos un método "insertarCONTACTO" y como parámetros los datos que queremos insertar en la tabla (id, nombre, telefono, email ....). 
Dentro del método creamos una instancia de la clase "SQLiteDatabase" y usamos su método "getWritableDatabase()" para poder 
escribir en la base de datos. Encapsulamos todo en un if por si acaso la base de datos no existe y ya dentro del if creamos 
una instancia de la clase "ContentValues" que como su nombre indica es un almacenador de un conjunto de datos. 
Usamos el metodo "put(key, value)" que nos pide como primer parámetro "key" el nombre donde establecer el valor almacenado 
y como segundo parámetro el valor que queremos almacenar. Una vez almacenamos los datos insertamos una fila en la 
tabla usamos el método "insert(table, nullColumnHack, values)" 
*/




public boolean insertarContacto(String nombre, String direccion, String telefono, String email,int miembrofacebook, int miembrotwitter, int miembrogoogle, int miembrolinkedin, int sexo, String tipocontacto, int imagen){
        SQLiteDatabase db = getWritableDatabase();
        if (db != null) {
            ContentValues valores = new ContentValues();
            valores.put("nombre", nombre);
            valores.put("direccion", direccion);
            valores.put("telefono", telefono);
            valores.put("email", email);
            valores.put("miembrofacebook", miembrofacebook);
            valores.put("miembrotwitter", miembrotwitter);
            valores.put("miembrogoogle", miembrogoogle);
            valores.put("miembrolinkedin", miembrolinkedin);
            valores.put("sexo", sexo);
            valores.put("tipocontacto", tipocontacto);
            valores.put("imagen", imagen);
            //db.insert("contactos", null, valores);
            try {
                db.insertOrThrow(TABLA, null, valores); //TABLA por "contactos"
                return true;
            } catch (SQLiteConstraintException e) {
                Log.d(TAG, "Fallo en la insercion: seguramente la clave ya existe.");
            }
        }
        db.close();   
        return false;
    }

    public boolean insertarContacto(SQLiteDatabase db, String nombre, String direccion, String telefono, String email,int miembrofacebook, int miembrotwitter, int miembrogoogle, int miembrolinkedin, int sexo, String tipocontacto, int imagen){

        if (db != null) {
            ContentValues valores = new ContentValues();
            valores.put("nombre", nombre);
            valores.put("direccion", direccion);
            valores.put("telefono", telefono);
            valores.put("email", email);
            valores.put("miembrofacebook", miembrofacebook);
            valores.put("miembrotwitter", miembrotwitter);
            valores.put("miembrogoogle", miembrogoogle);
            valores.put("miembrolinkedin", miembrolinkedin);
            valores.put("sexo", sexo);
            valores.put("tipocontacto", tipocontacto);
            valores.put("imagen", imagen);
            //db.insert("contactos", null, valores);
            try {
                db.insertOrThrow(TABLA, null, valores); //TABLA por "contactos"
                return true;
            } catch (SQLiteConstraintException e) {
                Log.d(TAG, "Fallo en la insercion: seguramente la clave ya existe.");
            }
        }   
        return false;
    }

    //Creo un insertarcontacto propio pasandole un contacto
    public boolean insertarContacto(ContactoAgenda contacto){
        SQLiteDatabase db = getWritableDatabase();
        if (db != null) {
            ContentValues valores = new ContentValues();
            valores.put("nombre", contacto.getNombre());
            valores.put("direccion", contacto.getDireccion());
            valores.put("telefono", contacto.getTelefono());
            valores.put("email", contacto.getMail());
            valores.put("miembrofacebook", contacto.isMiembroFacebook());
            valores.put("miembrotwitter", contacto.isMiembroTwitter());
            valores.put("miembrogoogle", contacto.isMiembroGoogle());
            valores.put("miembrolinkedin", contacto.isMiembroLinnkedin());
            valores.put("sexo", contacto.isSexo());
            valores.put("tipocontacto", contacto.getTipoContacto());
            valores.put("imagen", contacto.getDrawableImageId());
            //db.insert("contactos", null, valores);

            try {
                db.insertOrThrow(TABLA, null, valores); //TABLA por "contactos"
                return true;
            } catch (SQLiteConstraintException e) {
                Log.d(TAG, "Fallo en la insercion: seguramente la clave ya existe.");
            }   
        }
        db.close();   
        return false;
    }

    /*El método "update(table, values, whereClause, whereArgs)" para actualizar/modificar registros de nuestra tabla. 
     * Este método nos pide el nombre de la tabla "table", los valores a modificar/actualizar "values" (ContentValues), 
     * una condición WHERE "whereClause" que nos sirve para indicarle que valor queremos que actualice 
     * (en este caso cogemos como referencia la id de nuestro contacto) y como ultimo parámetro "whereArgs" podemos pasarle 
     * los valores nuevos a insertar, en este caso no lo vamos a necesitar por lo tanto lo ponemos a null. 
     * Para terminar deberemos cerrar siempre nuestra base de datos con el método "close()".
    */
    public boolean modificarContacto(String nombre, String direccion, String telefono, String email,int miembrofacebook, int miembrotwitter, int miembrogoogle, int miembrolinkedin, int sexo, String tipocontacto, int imagen){
        try {
            SQLiteDatabase db = getWritableDatabase();
            ContentValues valores = new ContentValues();
            valores.put("nombre", nombre);
            valores.put("direccion", direccion);
            valores.put("telefono", telefono);
            valores.put("email", email);
            valores.put("miembrofacebook", miembrofacebook);
            valores.put("miembrotwitter", miembrotwitter);
            valores.put("miembrogoogle", miembrogoogle);
            valores.put("miembrolinkedin", miembrolinkedin);
            valores.put("sexo", sexo);
            valores.put("tipocontacto", tipocontacto);
            valores.put("imagen", imagen);
            db.update(TABLA, valores, "email=" + email, null);
            //db.update("contactos", valores, "_id=" + id, null);
            db.close();   
            return true;
        } catch (Exception  e) {
            Log.d(TAG, "Fallo en la modificación.");
        }
        return false;
    }

    public boolean modificarContacto(ContactoAgenda contacto){
        try {
            SQLiteDatabase db = getWritableDatabase();
            ContentValues valores = new ContentValues();
            valores.put("nombre", contacto.getNombre());
            valores.put("direccion", contacto.getDireccion());
            valores.put("telefono", contacto.getTelefono());
            valores.put("email", contacto.getMail());
            valores.put("miembrofacebook", contacto.isMiembroFacebook());
            valores.put("miembrotwitter", contacto.isMiembroTwitter());
            valores.put("miembrogoogle", contacto.isMiembroGoogle());
            valores.put("miembrolinkedin", contacto.isMiembroLinnkedin());
            valores.put("sexo", contacto.isSexo());
            valores.put("tipocontacto", contacto.getTipoContacto());
            valores.put("imagen", contacto.getDrawableImageId());
            //  String mail="\""+contacto.getMail()+"\"";
            db.update(TABLA, valores, "email=" + contacto.getMail(), null);
            //db.update("contactos", valores, "_id=" + id, null); ---> db.update("contactos", valores, "_id=" + id, null);
            db.close();   
            return true;
        } catch (Exception  e) {
            Log.d(TAG, "Fallo en la modificación.");
        }
        return false;
    }

    /*
    Para borrar registros usaremos el método "delete(table, whereClause, whereArgs)" que nos pide el nombre de la tabla "table", 
    el registro a borrar "whereClause" que tomaremos como referencia su id y como ultimo parámetro "whereArgs" los valores a 
    borrar.
    */

    public boolean borrarContacto(String email) 
    {
        try {
            SQLiteDatabase db = getWritableDatabase();
            db.delete(TABLA, "email= '" + email+"'", null);
            db.close();  
            return true;
        } catch (Exception  e) {
            Log.d(TAG, "Fallo en la modificación.");
        }
        return false;
    }

    public boolean borrarContacto( ContactoAgenda contacto) 
    {
        try {
            SQLiteDatabase db = getWritableDatabase();
            db.delete(TABLA, "email= '" + contacto.getMail()+"'", null);
            db.close();  
            return true;
        } catch (Exception  e) {
            Log.d(TAG, "Fallo en la modificación.");
        }
        return false;
    }

    /*Este método devuelve un objeto Contactos con los datos del contacto (id, nombre, telefono, email). En este caso como 
     * queremos leer hacemos uso del método "getReadableDatabase()". Creamos una variable "valores_recuperar" con las columnas 
     * que queremos recuperar, en este caso vamos a recuperar todos los datos de un registro. 
     * Continuamos creando un "Cursor" que se encarga de devolver el resultado de un registro de la tabla y lo almacena en 
     * la memoria, le aplicamos el método: 
     *      query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit)
        Con este método conseguimos leer un registro de la tabla. Como primer parámetro "table" nos pide el nombre de la tabla, 
        "columns" las columnas que queremos recuperar, con "selection" le indicamos el registro a recuperar (en este caso 
        recuperamos con el id), o los registros a recuperar "selectionArgs", "groupBy" para agrupar los registros consultados, 
        "having" es un filtro para incluir los registros en el cursor (este parámetro se usaría con groupBy), "orderBy" para 
         ordenar las filas y "limit" para limitar el numero de filas consultadas.
        Con el método "moveToFirst()" ponemos el cursor al inicio de los datos almacenados. 
        Lo encapsulamos en un if por si acaso no hay datos almacenados.
        Continuamos creando un objeto "Contactos" para almacenar los datos consultados de un registro, y los vamos recuperando 
        del cursor con métodos get indicando la posición de la columna.
        Para terminar debemos cerrar la base de datos y el cursor.*/

    public ContactoAgenda recuperarContacto(String email) {
        SQLiteDatabase db = getReadableDatabase();

        String[] valores_recuperar = {"nombre","direccion","telefono","email", "miembrofacebook","miembrotwitter","miembrogoogle","miembrolinkedin","sexo","tipocontacto","imagen"};    

        Cursor c = db.query(TABLA, valores_recuperar, "email= '" + email+"'", null, null, null, null,null);

        if(c != null) {
            c.moveToFirst();
        }
        ContactoAgenda contactos = new ContactoAgenda(c.getString(0), c.getString(1), c.getString(2), c.getString(3),c.getInt(4), c.getInt(5), c.getInt(6), c.getInt(7),c.getInt(8), c.getString(9), c.getInt(10));
        db.close();
        c.close();
        return contactos;
    }
我是这样开始的

和函数insertarContacto(addContacto)

使用Eclipse时,TestConnection可以工作,但TestInsertArContecto不能

不知道我开始的方式是否正确,如果有任何提示或帮助,我将不胜感激。 我还怀疑在testBaseDatosContactos中,我是否必须在测试开始或结束时清理数据库,或者如何处理

感谢

BasedAtosContactos.java(我制作的,我需要使用测试驱动开发重新制作)

然后我开始测试驾驶。。。我想“移植”的第一件事是InsertarContecto

package com.example.tests;

import android.content.Context;

import com.example.informacion.BaseDatosContactos;
import com.example.informacion.BaseDatosGlobal;
import com.example.informacion.ContactoAgenda;

import junit.framework.TestCase;

public class testBaseDatosContactos extends TestCase {

    private BaseDatosGlobal bdGlobal;
    private BaseDatosContactos bdContactos;
    private ContactoAgenda contacto;

    public void setUp() throws Exception
    {
        super.setUp();
        bdGlobal = BaseDatosGlobal.getInstance();
        bdContactos = bdGlobal.agendaBaseDatos;
        contacto = new ContactoAgenda();
    }

    public void tearDown() throws Exception
    {
        super.tearDown();
        bdGlobal = null;
        bdContactos = null;
        contacto = null;
    }

    public void testConexion() throws Exception
    {
        assertNotSame(bdGlobal, null);
    }

    public void testInsertarContacto() throws Exception
    {
        contacto.setNombre("Pedro");
        contacto.setDireccion("c/ San Juan 2");
        contacto.setMail("pedro@mail.es");
        contacto.setMiembroFacebook(0);
        contacto.setMiembroGoogle(0);
        contacto.setMiembroLinnkedin(0);
        contacto.setMiembroTwitter(0);
        contacto.setTelefono("999888777");
        contacto.setTipoContacto("Laboral");

        boolean resultado = bdContactos.insertarContacto(contacto);
        assertEquals(resultado, true);
    }
}

请在问题中直接包含源代码,而不是提供链接;如果代码太长,请将其剥离到必要的部分以理解问题。它可能太长,如果我将其剥离,则可读性和清晰性会降低。。。如果你愿意,我可以贴在这里。。但在我看来,这会很长……好吧,这里有一个提示:如果你认为有问题的代码太长,无法粘贴到一个SO问题中,那么很可能是代码太长,句号太长。在任何情况下,无论如何都要将其包括在问题中;有些人确实会花时间钻研冗长的代码示例,并从中获取回答问题所需的元素。