2017-02-06 3 views
1

У меня есть класс, который имеет 3 метода: вставить, обновить и удалить из db. Чтобы проверить его в методе тестирования вставки, мне нужно использовать метод вставки, и после того, как я вставил, мне нужно удалить то, что я вставил, но чтобы удалить, я должен использовать метод удаления, который также хочу проверить, чтобы он не был Для меня смысл, что я должен использовать их, а также проверять их.Класс тестирования, который вставляет, обновляет и удаляет из db

Надеюсь, вы понимаете мою проблему. Заранее спасибо!

+0

Добро пожаловать в Переполнение стека! Пожалуйста, примите [тур] (http://stackoverflow.com/tour), осмотритесь и прочитайте [справочный центр] (http://stackoverflow.com/help), в частности [Как я могу спросить хороший вопрос?] (http://stackoverflow.com/help/how-to-ask) и [Какие темы можно задать здесь?] (http://stackoverflow.com/help/on-topic). вы планируете * UnitTests * или * приемочные испытания *? –

+0

Извините, что я не упомянул об этом. Я говорю об модульных тестах. – Sagie

+0

«Мне не показалось, что мне нужно их использовать, а также проверить их». В модульном тестировании имеет смысл, что для их использования вы должны их протестировать. –

ответ

1

Вы должны решить, что вы хотите проверить. Это вы описали, это тест интеграции. С помощью «реального» unitTest вы проверяете только свой метод, а не системный метод, а не базу данных.

Если вы хотите unitTest, у вас есть несколько вариантов. Например, вы работаете с интерфейсами и улавливаете свое утверждение до того, как оно поступит в базу данных.

Edit 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

+0

Как я могу реализовать этот пример? – Sagie

+0

Если я снова внедряю IDatabase, как я тестирую класс базы данных? Спасибо за ваш ответ! – Sagie

+0

Класс Database включал системный вызов для вставки, обновления и удаления в базе данных. Системный метод не тестируется в unittest. Для этого вам нужен интеграционный тест. С тестом интеграции, который вы тестируете: существует база данных, записывайте инструкцию в базу данных и так далее. – naro

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"); 
    } 

} 
+0

Я думал об этом. плохая практика? – Sagie

+0

Я не уверен, что это плохая практика. Я не знаю другого способа выполнения гарантийного теста в JUnit. –

+0

Я не думаю, что это плохая практика, потому что это интеграционный тест. И в тесте интеграции это дает зависимость, и некоторые из этих процессов для бэкэнд-систем требуют порядка или инициализации. В этом случае вам нужна база данных, которая вам не нужна в модульном тесте. – naro

Смежные вопросы