2012-07-06 69 views
16

我正在寻找一个Java工具,它会在我的测试中创建anonymous variables(我不关心的值),类似于.Net中的AutoFixture。这里是AutoFixture's readme的链接,它有很好的例子。有没有Java替代Ploeh的AutoFixture for .Net?

下面是来自同一自述采取了简单的例子:

[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世界中这样的工具?

编辑:

我想快速检查,虽然它成功地这样做什么,我一直在寻找:

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更改为类并将方法更改为字段,则生成器将引发一个仅支持接口的异常。

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

+0

当我在SO上找到我确切的问题时,我总是有一个灿烂的笑容。 (我知道评论没有增加太多的价值...) – 2015-12-19 12:31:13

回答

2

有一个Java实现快速检查,这对生成测试数据的API:

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

我不是太熟悉AutoFixture,我怀疑是快速检查稍有不同的一种考验框架,但也许它对解决您的特定问题很有用。

+0

谢谢。这看起来就像它会做这项工作,即使缺乏文档是令人震惊的。此外,文档声称支持POJO生成,但是当我尝试这样做时,生成器会抛出一个异常“Only interfaces supported” – 2012-07-06 23:36:02

+0

@IvanAlagenchev是的,文档不是很好。它看起来像你必须建立一个自定义的发电机来做你想要的类和字段POJO一代。这里有一个例子:http://java.net/projects/quickcheck/sources/repository/content/quickcheck-examples/src/test/java/FileGeneratorTest.java – 2012-07-07 12:55:52

1

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()); 
    } 
} 
+0

谢谢@Thomas Jung,我会继续这种方法对于复杂类 – 2012-09-27 03:34:56

0

Yet Another QuickCheck for Java是另一种工具,你可能会去看看。

它与JUnit(它支持测试参数,配置生成对象的注释等)非常集成。它有很多生成器(所有的quickcheck,以及一些特定的OOP,比如接口,抽象类和单例生成器),你可以定义你自己的。还有一个基于构造函数的生成器。

目前处于alpha状态,但如果您看一下downloads page,您会看到一个基本文档。

+0

感谢您的链接。我看了一下,有两件事会让我远离在我的项目中使用它。第一个是它得到了大学的支持 - 我对使用这样的项目非常紧张。毕业生离开后通常没有人维护。第二个是自去年四月以来没有更新过。我会保持眼睛,如果有一些活动,我可能会通过Java的QuickCheck实现。 – 2012-08-20 01:52:25

5

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

这仍处于积极的发展阶段,功能要求正在兑现。

+0

这看起来很有希望! – Jan 2015-08-14 07:12:02

1

我使用JFixture沿Mockito .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 
0

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

例子:

ObjectFactory rof = new ReflectionObjectFactory(); 

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

也正是在Maven的中央仓库中。