Есть ли альтернатива Java для Ploeh AutoFixture для .Net?

Я ищу инструмент Java, который создавал бы анонимные переменные (переменные, значение которых мне неинтересно) в моих тестах, аналогично к AutoFixture в .Net. Вот ссылка на AutoFixture readme, который имеет довольно хорошие примеры того, что он делает.

Вот краткий пример, взятый из одного и того же 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
}

Есть ли такой инструмент в мире Java?

Edit:

Я попробовал 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 на класс и метод на поле, генератор генерирует исключение, поддерживающее только интерфейсы.

Я искренне надеюсь, что есть что-то лучше, тем более, что документация серьезно отсутствует.

Ответы

Ответ 1

Существует реализация Java QuickCheck, которая имеет API для генерации тестовых данных:

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

Я не слишком хорошо знаком с AutoFixture, и я подозреваю, что QuickCheck - это немного другой тип тестовой среды, но, возможно, он полезен для решения вашей конкретной проблемы.

Ответ 2

Там также JFixture, который доступен на github и опубликован в центре maven.

Это все еще находится в активной разработке, и запросы функций выполняются.

Ответ 3

Иван

Я начал проект посвященный переопределению основных функций AutoFixture в java. У AutoFixture, безусловно, много возможностей, поэтому мне нужно определить приоритеты, какие из них нужно реализовать в первую очередь, а какие вообще не нужно выполнять. Когда проект только начинается, я приветствую тестирование, отчеты о дефектах и ​​запросы функций.

Ответ 4

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

Ответ 5

Я использую JFixture Mockito.spy() для этого:)

Посмотрим пример, как сделать что-то, что было бы тривиально с AutoFixture и С#. Идея здесь состоит в том, чтобы генерировать случайные данные в вашем объекте, за исключением некоторых конкретных методов, которые должны иметь определенные значения. Интересно, что я не нашел, что где-то было сказано. Этот метод исключает часть "Упорядочить" ваши модульные тесты как небольшое количество строк и, кроме того, фокусируется на том, какие значения должны быть конкретными для этого unit test для прохождения

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

Ответ 6

Еще один QuickCheck для Java - еще один инструмент, который вы, возможно, можете посмотреть.

Он очень интегрирован с JUnit (он поддерживает тесты с параметрами, аннотации для настройки сгенерированных объектов и т.д.).

В нем много генераторов (все quickcheck и некоторые специфичные для OOP, такие как интерфейсы, абстрактные классы и генераторы Singleton), и вы можете определить свои собственные. Существует также генератор на основе конструктора.

В настоящее время находится в альфа-статусе, но если вы посмотрите на страницу downloads, вы увидите базовую документацию.

Ответ 7

Попробуйте объект factory. Он открыт на github. Он может создавать случайные объекты Java только в одной строке кода. И он очень настраиваемый.

Пример:

ObjectFactory rof = new ReflectionObjectFactory();

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

Он также доступен в Центральном репозитории Maven.