2012-07-06 21 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的中央倉庫中。

相關問題