Есть ли альтернатива 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
}
</int></myclass></int>

Есть ли такой инструмент в мире 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></integer></string>

Инструмент, похоже, работает только с интерфейсами. Если я изменю Test на класс и метод на поле, генератор генерирует исключение, поддерживающее только интерфейсы.

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

7 ответов

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

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

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


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

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


Иван

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


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());
</test>

Я бы предпочел простую реализацию Generator:

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


Я использую 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-****-4805-89e3-308ef69e7091


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

Пример:

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

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


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

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

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

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

licensed under cc by-sa 3.0 with attribution.