我的类有3个方法:从db中插入,更新和删除。 为了在插入测试方法中测试它,我需要使用insert方法,在插入后我需要删除我插入的内容,但为了删除我应该使用我也想测试的删除方法,所以它没有&# 39;对我来说,我需要使用它们并测试它们。
我希望你理解我的问题。提前谢谢!
答案 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。