从db中插入,更新和删除的测试类

时间:2017-02-06 15:04:06

标签: java database junit sql-insert sql-delete

我的类有3个方法:从db中插入,更新和删除。 为了在插入测试方法中测试它,我需要使用insert方法,在插入后我需要删除我插入的内容,但为了删除我应该使用我也想测试的删除方法,所以它没有&# 39;对我来说,我需要使用它们并测试它们。

我希望你理解我的问题。提前谢谢!

2 个答案:

答案 0 :(得分:1)

默认情况下,JUnit中不保证测试方法的顺序。然而,从JUnit 4.11开始,您可以按测试名称排序,如下所示:

import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;

@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class Test1 {

    @Test
    public void aInsert() {
        System.out.println("first INSERT");
    }

    @Test
    public void bUpdate() throws Exception {
        System.out.println("second UPDATE");
    }

    @Test
    public void cDelete() throws Exception {
        System.out.println("third DELETE");
    }

}

答案 1 :(得分:1)

您必须决定要测试的内容。那是你描述的,它是一个集成测试。通过“真正的”unitTest,您只测试您的方法,而不是System方法而不是数据库。

如果你想要一个unitTest,你有几个选择。例如,您使用接口并在数据库出现之前捕获您的语句。

编辑1 - 使用接口实现单元测试的一种可能性:

您需要一个实现这些方法的接口,这些接口将进入后端系统:

public interface IDatabase{

    public returnValue insert(yourParam);

    public int update(yourParam);

}

然后使用类中的实际函数实现您的方法:

public class Database implements IDatabase {

    @Override
    public returnValue insert(yourParam) {
        // do something
        return null;
    }

    @Override
    public int update(yourParam){
        // do something
        return 0;
    }    
}

您在主课程中调用的这个课程:

/**
 * The real class to do what you want to do.
 */
public class RealClass {

private IDatabase dbInstance = null;

    private IDatabase getDbInstance() {
        if (dbInstance == null) {
            dbInstance = new Database();
        }
        return dbInstance;
    }

    protected void setDbInstance(IDatabase dataBase) {
        dbInstance = dataBase;
    }

    public static void main(String[] args) {
        getDbInstance().insert(yourParam);

    }
}

对于单元测试,您再次实现接口:

public class UnitTest implements IDatabase {

    @Override
    public returnValue insert(yourParam) {
        // Here can you test your statement and manipulate the return value
        return null;
    }

    @Override
    public int update(yourParam){
        if (yourParam.containsValue(value1)) {
          assertEquals("yourStatement", yourParam);
          return 1;
        }else if (yourParam.containsValue(value2)) {
          assertEquals("yourStatement2", yourParam);
          return 5;
        }else{
           assertTrue(false,"unknown Statement")
        }
    }

    @Test
    public void yourTest(){
       RealClass.setDbInstance(this);
        //Test something
    }        
}

这实现起来非常耗时,但是这样,您可以独立于后端系统,并且每次都可以在没有数据库的情况下调用unittest。

enter image description here