24

我正在寻找一种 Java 工具,它可以在我的测试中创建匿名变量(我不关心其值的变量),类似于 .Net 中的 AutoFixture。这是AutoFixture 的自述文件的链接,其中有很好的例子来说明它的作用。

这是取自同一个自述文件的一个简短示例:

[TestMethod]
public void IntroductoryTest()
{
    // Fixture setup
    Fixture fixture = new Fixture();

    int expectedNumber = fixture.CreateAnonymous<int>();
    MyClass sut = fixture.CreateAnonymous<MyClass>();
    // Exercise system
    int result = sut.Echo(expectedNumber);
    // Verify outcome
    Assert.AreEqual<int>(expectedNumber, result, "Echo");
    // Teardown
}

Java世界有这样的工具吗?

编辑:

我尝试了 QuickCheck,虽然它设法完成了我正在寻找的事情:

import net.java.quickcheck.Generator;
import net.java.quickcheck.generator.PrimitiveGenerators;
import net.java.quickcheck.generator.support.ObjectGeneratorImpl;

public class Main {

interface Test{
     String getTestValue();
}

public static void main(String[] args) {
    Generator<String> stringGen = PrimitiveGenerators.strings(5, 100);
    Generator<Integer> intGen = PrimitiveGenerators.integers(5, 20);

    ObjectGeneratorImpl<Test> g = new ObjectGeneratorImpl<>(Test.class);
    g.on(g.getRecorder().getTestValue()).returns(stringGen);


    for (int i = 0; i < intGen.next(); i++) {
        System.out.println("value of testValue is: " + g.next().getTestValue());
    }
}

}

该工具似乎只适用于接口。如果我将 Test 更改为类并将方法更改为字段,则生成器会引发仅支持接口的异常。

我真诚地希望有更好的东西,特别是因为文档严重缺乏。

4

7 回答 7

8

还有 JFixture 可以在github上找到并发布到maven central

这仍在积极开发中,并且正在满足功能请求。

于 2015-06-09T12:13:36.107 回答
4

伊万,

我开始了一个项目,专注于在 java 中重新实现 AutoFixture 的核心功能。AutoFixture 肯定有很多特性,所以我需要优先考虑哪些要先实现,哪些根本不去实现。由于项目刚刚开始,我欢迎测试、缺陷报告和功能请求。

于 2014-02-23T12:45:33.567 回答
3

我在 Mockito .spy () 上使用JFixture ;)

让我们看一个示例,如何使用 AutoFixture 和 C# 做一些简单的事情。这里的想法是在您的对象中生成随机数据,除了一些需要具有特定值的特定方法。有趣的是,我没有发现某处说明了这一点。这种技术消除了单元测试的“排列”部分,使其成为少量的行,此外还侧重于该单元测试需要特定的值才能通过

public class SomeClass {
    public int id; //field I care
    public String name; // fields I don't care
    public String description; //fields I don't care

    public int getId(){
        return id;
    } 

    public void setId(int id){
        this.id = id;
    }

    public String getName(){
        return name;
    }

    public void setName(String name){
        this.name = name;
    }

    public String getDescription(){
        return description;
    }

    public void setDescirption(String description){
        this.description = description;
    }
}



public static void main(String args[]){
    JFixture fixture = new JFixture();
    fixture.customise().circularDependencyBehaviour().omitSpecimen(); //omit circular dependencies
    fixture.customise().noResolutionBehaviour().omitSpecimen(); // omit methods that cannot be resolved
    SomeClass entity = fixture.create(SomeClass.class);
    SomeClass mock = Mockito.spy(entity);
    Mockito.when(mock.getId()).thenReturn(3213);

    System.out.println(mock.getId()); // always 3213
    System.out.println(mock.getName()); // random
    System.out.println(mock.getDescription()); //random
}

这打印:

3213
name9a800265-d8ef-4be9-bd45-f0b62f791d9c
descriptiona9f9245f-eba1-4805-89e3-308ef69e7091
于 2015-10-03T13:39:09.230 回答
3

试试对象工厂。它在github上开源。它可以在一行代码中创建随机的 Java 对象。它是高度可配置的。

例子:

ObjectFactory rof = new ReflectionObjectFactory();

String str = rof.create(String.class);
Customer cus = rof.create(Customer.class);

它也可以在 Maven 中央存储库中使用。

于 2015-11-10T21:57:33.170 回答
2

QuickCheck 有一个 Java 实现,它具有用于生成测试数据的 API:

http://java.net/projects/quickcheck/pages/Home

我对 AutoFixture 不太熟悉,我怀疑 QuickCheck 是一种略有不同的测试框架,但它可能对解决您的特定问题很有用。

于 2012-07-06T19:26:13.877 回答
2

ObjectGenerator 更像是一个实验性功能:

ObjectGenerator<Test> objects = PrimitiveGenerators.objects(Test.class);
objects.on(objects.getRecorder().getTestValue()).returns(PrimitiveGenerators.strings());

Test next = objects.next();
System.out.println(next.getTestValue());

我更喜欢一个简单的生成器实现:

class TestGenerator implements Generator<Test>{
    Generator<String> values = PrimitiveGenerators.strings();
    @Override public Test next() {
        return new TestImpl(values.next());
    }   
}
于 2012-07-11T08:33:54.053 回答
0

然而,Another QuickCheck for Java是另一个您可能会看一看的工具。

它与 JUnit 非常集成(它支持带参数的测试、注释以配置生成的对象等)。

它有很多生成器(都是 quickcheck,还有一些特定于 OOP,例如接口、抽象类和单例生成器),您可以定义自己的生成器。还有一个基于构造函数的生成器。

目前处于 alpha 状态,但如果您查看下载页面,您会看到基本文档。

于 2012-07-12T00:09:34.693 回答