[英]Is there a Java alternative to Ploeh's AutoFixture for .Net?
我正在尋找一個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更改為類,並將方法更改為字段,則生成器會拋出僅支持接口的異常。
我真誠地希望有更好的東西,特別是因為文件嚴重缺乏。
還有JFixture可以在github上找到並發布到maven central 。
這仍處於積極開發階段,功能請求正在得到尊重。
伊萬,
我開始了一個專注於重新實現java中AutoFixture核心功能的項目 。 AutoFixture肯定有很多功能,所以我需要優先考慮首先實現哪些功能,哪些功能根本不需要執行。 由於項目剛剛開始,我歡迎測試,缺陷報告和功能請求。
試試對象工廠。 它是在github上開源的。 它可以在一行代碼中創建隨機Java對象。 它具有高度可配置性。
例:
ObjectFactory rof = new ReflectionObjectFactory();
String str = rof.create(String.class);
Customer cus = rof.create(Customer.class);
它也可以在Maven Central Repository中找到。
有一個QuickCheck的Java實現,它有用於生成測試數據的API:
http://java.net/projects/quickcheck/pages/Home
我對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());
我更喜歡簡單的Generator實現:
class TestGenerator implements Generator<Test>{
Generator<String> values = PrimitiveGenerators.strings();
@Override public Test next() {
return new TestImpl(values.next());
}
}
我在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
另一個QuickCheck for Java是另一個你可能會看一看的工具。
它與JUnit非常集成(它支持帶參數的測試,注釋來配置生成的對象等)。
它有很多生成器(所有的快速檢查,一些特定於OOP,如接口,抽象類和單例生成器),你可以定義自己的生成器。 還有一個基於構造函數的生成器。
目前處於alpha狀態,但如果您查看下載頁面,您將看到基本文檔。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.