2016-04-20 1 views
-2

Я пишу тесты JUnit для проверки работы CRUD в классах DAO. Это в значительной степени код шаблона, и основная его часть заключается в создании тестового объекта и присваивании фиктивных значений переменным экземпляра. Существуют ли какие-либо инструменты в Java для создания объекта и назначения фиктивных значений на основе объявленного типа?Есть ли инструменты для создания фиктивных объектов для использования в тестовых случаях JUnit?

Я не хочу использовать JMock или Mockito, поскольку мне нужно взаимодействовать с базой данных и проверять успешность операций CRUD.

ответ

0

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

Но, возможно, следующий подход будет близок к тому, чего вы хотите достичь.

псевдокод

Foo foo = new Foo(); 
foo.setIntValue(generateInt()); 
foo.setStringValue(generateString(20)); 
... 
// store the record in the database 
// retrieve the record from the database 
// check if the retrieved values are equal to the values in `foo` 

Если это то, что вы хотите достичь вы можете взглянуть на QuickCheck

Цель QuickCheck должен заменить вручную определена значения с сгенерированных значений. Тест, основанный на QuickCheck, пытается охватить законы домена, тогда как классическое тестирование может проверять достоверность только для отдельных значений.

В принципе, QuickCheck относится к генераторам данных. Метод RunCheck QuickCheck - это просто фантазия для реализации цикла. QuickCheck может помочь в сценариях, где должны тестироваться целые классы тестовых примеров, и не представляется возможным писать тесты для всех различных тестовых сценариев.

Таким образом, вы можете создать свой собственный Generator, который обеспечивает экземпляры Foo уже заполнены с нечеткими данными. В сочетании с Junit Theories вы будете близки к своему первоначальному требованию.

Пример использования Theories с помощью специального генератора вы можете найти here. Пример был написан для аналогичной библиотеки (junit-quickcheck). Но это должно продемонстрировать вашу идею.

Редактировать Примерно на примере junit-quickcheck. Это может выглядеть как в следующем фрагменте.

import net.java.quickcheck.Generator; 
import static net.java.quickcheck.generator.PrimitiveGenerators.characters; 

public class MyCharacterGenerator implements Generator<String> { 

    private static final String LOWERCASE_CHARS = "abcdefghijklmnopqrstuvwxyz"; 
    private static final String UPPERCASE_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    private static final String NUMBERS = ""; 
    private static final String SPECIAL_CHARS = ".-\\;:[email protected][]^/|}{"; 
    private static final String ALL_MY_CHARS = LOWERCASE_CHARS 
      + UPPERCASE_CHARS + NUMBERS + SPECIAL_CHARS; 
    public static final int CAPACITY = 40; 

    Generator<Character> characterGenerator = characters(ALL_MY_CHARS); 

    public String generate() { 
     StringBuilder sb = new StringBuilder(CAPACITY); 
     for (int i = 0; i < CAPACITY; i++) { 
      sb.append(characterGenerator.next()); 
     } 
     return sb.toString(); 
    } 

    @Override 
    public String next() { 
     return generate(); 
    } 
} 

.

import net.java.quickcheck.Generator; 
import static org.testng.Assert.assertTrue; 
import org.testng.annotations.Test; 

public class MyCharacterGeneratorTest { 

    @Test 
    public void testStringGenerator() { 
     Generator<String> fuzzyString = new MyCharacterGenerator(); 

     for (int i = 0; i < 10; i++) { 
      String fuzzy = fuzzyString.next(); 
      System.out.println("fuzzy: " + fuzzy); 
      assertTrue(fuzzy.length() == MyCharacterGenerator.CAPACITY); 
      assertTrue(fuzzy.matches("[a-zA-Z0-9.\\-\\\\;:[email protected]\\[\\]^/|}{]*")); 
     } 
    } 
} 

выход

------------------------------------------------------- 
T E S T S 
------------------------------------------------------- 
Running MyCharacterGeneratorTest 
fuzzy: ;d|xrS|[email protected]\.ly600{[email protected];de5:jN 
fuzzy: UCZBO|QJ/[email protected];b 
fuzzy: Jg}xD44_AFVqy\UKMehGPnV8xmKKy]dDXJsYIG9C 
fuzzy: k-eN-Sf^eK.bqqn4PR2[93{wyzgwr_F_ktBGkTP} 
fuzzy: 1UDChf3aWN0d/[email protected]}K[W2|P]}.ePzKvRJMJtB0/Z 
fuzzy: @J2}[email protected]]smpKWZ;[email protected]}[email protected] 
fuzzy: goL8o5qz-Ynga:i;WqGhKTo^1itHqENXM3OrO||4 
fuzzy: _\1ifR:ssplcdT9l\s{clV9ZozgCA^I67IF/|t0t 
fuzzy: /FwL9nCuRcemqR2SP3|XG9ui5Y21K:r0Ys1XIz/3 
fuzzy: 8U[Xk^e60JhGfLTMyGZ:Z;[email protected]\oJ7] 
+0

Это прекрасно! Спасибо, что нашли время ответить. – Kiran

+0

@ Киран. Добро пожаловать. Рад, что я мог бы помочь. – SubOptimal

0

Я думаю, что вы ищете нечто вроде Мокито. Mockito дает вам возможность «FAKE» или издеваться над объектами и то, что возвращается при вызове метода из этого издевающегося объекта. Mockito может использоваться для того, чтобы делать то, о чем вы говорите, и высмеивать объект, а также то, что возвращается, из которого когда-либо вы хотите все, что вам нужно, чтобы вы могли выполнить единичный тест со всеми зависимостями под вашим контролем.

+0

Я использую Mockito для тестирования услуги, но я хочу, чтобы взаимодействовать с базой данных, чтобы испытать объекты DAO. Тесты состоят в том, чтобы убедиться, что операции CRUD успешны, и нет ошибок при сопоставлении переменных для исправления столбцов и т. Д. – Kiran

+0

Вы можете использовать Spring, чтобы создать экземпляр и ввести его в свой тест. Это даст вам прочную основу для тестирования. В конфигурации Spring вы можете добавить любые значения, которые вы пожелаете, и выполнить их с помощью инъекции. – Dale

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