2012-07-06 14 views
16

Tôi đang tìm một công cụ Java có thể tạo anonymous variables (các biến có giá trị mà tôi không quan tâm) trong các thử nghiệm của tôi, tương tự như AutoFixture trong .Net. Đây là một liên kết đến AutoFixture's readme, trong đó có các ví dụ khá tốt về những gì nó làm.Có sự thay thế Java nào đối với AutoFixture của Ploeh cho .Net không?

Dưới đây là một ví dụ ngắn lấy từ cùng một readme:

[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 
} 

Có như vậy một công cụ trong thế giới Java?

Edit:

tôi đã cố gắng QuickCheck và trong khi nó cố gắng làm điều gì đó giống như những gì tôi đang tìm kiếm:

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

} 

Công cụ này dường như chỉ làm việc với giao diện. Nếu tôi thay đổi Kiểm tra thành một lớp và phương thức thành một trường, trình tạo phát ra một ngoại lệ chỉ có các giao diện được hỗ trợ.

Tôi chân thành hy vọng rằng có điều gì đó tốt hơn, đặc biệt là vì tài liệu bị thiếu nghiêm trọng.

+0

Tôi luôn có một nụ cười lớn khi tôi tìm câu hỏi chính xác về SO. (Tôi biết bình luận không thêm nhiều giá trị ...) –

Trả lời

2

Có một thực hiện Java của QuickCheck, trong đó có các API để tạo ra dữ liệu thử nghiệm:

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

Tôi không quá quen thuộc với AutoFixture, và tôi nghi ngờ rằng QuickCheck là một loại hơi khác nhau của bài kiểm tra khuôn khổ, nhưng có lẽ nó rất hữu ích để giải quyết vấn đề cụ thể của bạn.

+0

Cảm ơn. Điều này xuất hiện như nó sẽ làm công việc, mặc dù thiếu tài liệu là kinh khủng. Ngoài ra, các tài liệu tuyên bố để hỗ trợ thế hệ POJO, nhưng khi tôi cố gắng làm điều đó, máy phát điện ném một ngoại lệ "Chỉ giao diện được hỗ trợ" –

+0

@IvanAlagenchev vâng, tài liệu không phải là rất tốt. Có vẻ như bạn phải xây dựng một trình tạo tùy chỉnh để thực hiện loại lớp và trường POJO mà bạn muốn. Có một ví dụ về điều này ở đây: http://java.net/projects/quickcheck/sources/repository/content/quickcheck-examples/src/test/java/FileGeneratorTest.java –

1

ObjectGenerator là chi tiết của một tính năng thử nghiệm:

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

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

Tôi muốn một thi Generator đơn giản:

class TestGenerator implements Generator<Test>{ 
    Generator<String> values = PrimitiveGenerators.strings(); 
    @Override public Test next() { 
     return new TestImpl(values.next()); 
    } 
} 
+0

Cảm ơn @Thomas Jung, tôi sẽ tiếp tục với cách tiếp cận này cho các lớp phức tạp –

0

Yet Another QuickCheck for Java là một công cụ mà bạn có thể có thể có một cái nhìn.

Nó rất tích hợp với JUnit (nó hỗ trợ kiểm tra với các tham số, chú thích để định cấu hình các đối tượng đã tạo và vv).

Nó có rất nhiều máy phát (tất cả các kiểm tra nhanh, và một số cụ thể cho OOP, chẳng hạn như giao diện, lớp trừu tượng và máy phát singleton), và bạn có thể xác định riêng của bạn. Ngoài ra còn có một bộ tạo dựa trên hàm tạo.

Hiện đang ở trạng thái alpha, nhưng nếu bạn xem qua số downloads page, bạn sẽ thấy tài liệu cơ bản.

+0

nhờ liên kết. Tôi đã xem xét nó và có hai điều về nó sẽ giúp tôi tránh xa việc sử dụng nó trong các dự án của tôi. Điều đầu tiên là nó được hỗ trợ bởi một trường đại học - tôi khá lo lắng về việc sử dụng các dự án như vậy. Thường không có ai để duy trì sau khi học sinh tốt nghiệp rời đi. Thứ hai là nó chưa được cập nhật kể từ tháng 4 năm ngoái. Tôi sẽ giữ một mắt mặc dù và nếu có một số hoạt động tôi có thể đi với nó qua việc thực hiện java của QuickCheck. –

3

Ivan,

Tôi bắt đầu một project focused on reimplementing core features of AutoFixture in java. AutoFixture chắc chắn có rất nhiều tính năng, vì vậy tôi cần ưu tiên cái nào cần thực hiện trước và cái nào không bận tâm đến việc triển khai thực hiện. Khi dự án mới bắt đầu, tôi hoan nghênh các thử nghiệm, báo cáo lỗi và các yêu cầu tính năng.

5

Ngoài ra còn có JFixture có sẵn trên github và được xuất bản lên maven central.

Điều này vẫn đang trong quá trình phát triển tích cực và các yêu cầu tính năng đang được tôn trọng.

+0

Điều này có vẻ rất hứa hẹn! – Jan

1

Tôi đang sử dụng JFixture cùng Mockito .spy() cho rằng;)

Chúng ta hãy xem một ví dụ làm thế nào để làm điều gì đó mà nó sẽ là tầm thường với AutoFixture và C#. Ý tưởng ở đây là tạo ra dữ liệu ngẫu nhiên trong đối tượng của bạn ngoại trừ một số phương pháp cụ thể cần có các giá trị cụ thể. Điều thú vị là tôi không tìm thấy ở đâu đó đã nêu .. Kỹ thuật này loại bỏ phần "Sắp xếp" của các bài kiểm tra đơn vị của bạn thành một số ít dòng và ngoài ra hãy tập trung vào những giá trị cần cụ thể cho bài kiểm tra đơn vị này để vượt qua

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 
} 

in này: nhà máy đối tượng

3213 
name9a800265-d8ef-4be9-bd45-f0b62f791d9c 
descriptiona9f9245f-eba1-4805-89e3-308ef69e7091 
0

Hãy thử. Nó được mở nguồn trên github. Nó có thể tạo các đối tượng Java ngẫu nhiên chỉ trong một dòng mã. Và nó có khả năng cấu hình cao.

Ví dụ:

ObjectFactory rof = new ReflectionObjectFactory(); 

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

Nó cũng có sẵn trong Maven Trung Repository.

Các vấn đề liên quan