Ploeh'有Java替代方案吗;是.Net的AutoFixture吗?

Ploeh'有Java替代方案吗;是.Net的AutoFixture吗?,java,unit-testing,mocking,quickcheck,autofixture,Java,Unit Testing,Mocking,Quickcheck,Autofixture,我正在寻找一个Java工具,它可以在我的测试中创建(我不关心其值的变量),类似于.Net中的AutoFixture。这里有一个到的链接,它有很好的例子说明它的功能 以下是同一自述文件中的一个简短示例: [TestMethod] public void IntroductoryTest() { // Fixture setup Fixture fixture = new Fixture(); int expectedNumber = fixture.CreateAnony

我正在寻找一个Java工具,它可以在我的测试中创建(我不关心其值的变量),类似于.Net中的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
}
[TestMethod]
公共无效导入器测试()
{
//夹具设置
夹具=新夹具();
int expectedNumber=fixture.CreateAnonymous();
MyClass sut=fixture.CreateAnonymous();
//运动系统
int result=sut.Echo(expectedNumber);
//核实结果
Assert.AreEqual(预期的数字,结果,“Echo”);
//拆卸
}
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());
    }
}

}
import net.java.quickcheck.Generator;
导入net.java.quickcheck.generator.PrimitiveGenerators;
导入net.java.quickcheck.generator.support.ObjectGeneratorImpl;
公共班机{
接口测试{
字符串getTestValue();
}
公共静态void main(字符串[]args){
Generator stringGen=原始生成器。字符串(5100);
Generator intGen=原始生成器。整数(5,20);
ObjectGeneratorImpl g=新的ObjectGeneratorImpl(Test.class);
g、 on(g.getRecorder().getTestValue())。返回(stringGen);
for(inti=0;i
该工具似乎只适用于接口。如果我将Test更改为一个类,将方法更改为一个字段,那么生成器将抛出一个异常,该异常只支持接口


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

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


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

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());
ObjectGenerator对象=PrimitiveGenerators.objects(Test.class);
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());
    }   
}
类TestGenerator实现生成器{
生成器值=PrimitiveGenerators.strings();
@覆盖公共测试下一步(){
返回新的TestImpl(values.next());
}   
}
是另一个工具,您可能需要看看

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

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

当前处于alpha状态,但如果您查看,您将看到基本文档。

Ivan


我开了一家公司。AutoFixture当然有很多功能,所以我需要优先考虑哪些功能首先要实现,哪些功能根本不需要实现。由于项目刚刚开始,我欢迎测试、缺陷报告和功能请求。

还有JFixture,可在上获得并发布到

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

为此我使用了along.spy()

让我们看一个例子,如何使用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

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

例如:

ObjectFactory rof = new ReflectionObjectFactory();

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

它也可以在Maven Central Repository中找到。

谢谢。这似乎可以完成这项工作,尽管缺乏文档令人震惊。另外,文档声称支持POJO生成,但是当我尝试这样做时,生成器抛出一个异常“仅支持接口”@IvanAlagenchev是的,文档不是很好。看起来您必须构建一个自定义生成器来生成所需的类和字段POJO。这里有一个例子:谢谢你的链接。我看了一下,有两件事让我无法在项目中使用它。第一个是它有一所大学的支持——我对使用这样的项目感到非常紧张。研究生离开后,通常没有人需要赡养。第二个问题是,自去年4月以来,它一直没有更新过。不过,我会密切关注,如果有什么活动,我可能会在QuickCheck的java实现上进行。谢谢@Thomas Jung,我将继续使用这种方法处理复杂类。这看起来非常有希望!当我发现自己的问题是这样的时候,我总是面带微笑。(我知道这条评论没有多大价值…)你做得怎么样?它有效,你可以在maven central上找到二进制文件。我只实现了我使用过的AutoFixture中的部分,因此可能缺少一些东西(我欢迎这些问题)。它需要Java8。还有一种JFixture(参见Jane Nicholson的答案)形式的替代方案,它似乎正在积极开发中,所以我想说您可以选择:-)。