是否有任何工具可用于创建用于JUnit测试用例的虚拟对象?

时间:2016-04-20 03:52:37

标签: java junit

我正在编写JUnit测试用例来测试DAO类中的CRUD操作。它几乎是样板代码,其中很大一部分是创建测试对象并为实例变量分配虚拟值。 Java中是否有任何工具可以创建对象并根据声明的类型分配虚拟值?

我不想使用JMock或Mockito,因为我需要与数据库交互并测试CRUD操作是否成功。

4 个答案:

答案 0 :(得分:0)

我认为你要找的东西就像Mockito。 Mockito使您能够“伪造”或模拟对象以及调用该模拟对象中的方法时返回的内容。 Mockito可以用来完全按照你所说的去做并模拟一个对象以及从你想要的任何方法返回的内容,让你灵活地在你控制之下真正进行单元测试。

答案 1 :(得分: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是关于数据的生成器。 QuickCheck runner方法只是对循环实现的一种幻想。 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 = "0123456789";
    private static final String SPECIAL_CHARS = ".-\\;:_@[]^/|}{";
    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.\\-\\\\;:_@\\[\\]^/|}{]*"));
        }
    }
}

<强>输出

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running MyCharacterGeneratorTest
fuzzy: ;d|xrS|dFS3H@xZRnzE6N\.ly600{C@ll;de5:jN
fuzzy: UCZBO|QJ/6fLqBH9QwFpPcUK.Qa5hEgFR_3A1@;b
fuzzy: Jg}xD44_AFVqy\UKMehGPnV8xmKKy]dDXJsYIG9C
fuzzy: k-eN-Sf^eK.bqqn4PR2[93{wyzgwr_F_ktBGkTP}
fuzzy: 1UDChf3aWN0d/95@}K[W2|P]}.ePzKvRJMJtB0/Z
fuzzy: @J2}kMK@.uZY]smpKWZ;C4@p-Kp9}KUtan@oVLX9
fuzzy: goL8o5qz-Ynga:i;WqGhKTo^1itHqENXM3OrO||4
fuzzy: _\1ifR:ssplcdT9l\s{clV9ZozgCA^I67IF/|t0t
fuzzy: /FwL9nCuRcemqR2SP3|XG9ui5Y21K:r0Ys1XIz/3
fuzzy: 8U[Xk^e60JhGfLTMyGZ:Z;gn9UCXcUEu@wV\oJ7]

答案 2 :(得分:0)

聚会晚了一点,但是lorem-ipsum-objects可以为您即时生成任何类型的测试数据。

这是主页上的基本用法示例:

  

基本用法:

     
LoremIpsumObjectCreator creator = new LoremIpsumObjectCreator();

creator.createLoremIpsumObject(clazz);
     

使用自定义工厂:

     
ClassBindings classBindings = new ClassBindings(); // or:
ClassBindings classBindings = ClassBindings.defaultBindings(); // defaults for collections

classBindings.add(List.class, new ClassBasedFactory<>(ArrayList.class));

LoremIpsumObjectCreator creator = new LoremIpsumObjectCreator(classBindings);
creator.createLoremIpsumObject(clazz);

要将其应用于当前接受的答案中提到的示例:

Foo foo = new Foo();
foo.setIntValue(creator.createLoremIpsumObject(int.class));
foo.setStringValue(creator.createLoremIpsumObject(String.class));

甚至更好:

Foo foo = creator.createLoremIpsumObject(Foo.class);

答案 3 :(得分:0)

也许这个库可以帮助您。

six2six/fixture-factory

我已经在一些项目中使用过它,包括最近的项目。使用非常简单。

我想指出的一件事是,我觉得lib几年来没有更新。