공장 소녀와 같은 프레임 워크가 Java에 존재합니까? [닫은
-
13-09-2019 - |
문제
공장 소녀는 테스트를위한 모델 인스턴스를 쉽게 만들기 위해 레일의 편리한 프레임 워크입니다.
로부터 공장 소녀 홈페이지:
factory_girl을 사용하면 각 모델의 프로토 타입을 신속하게 정의하고 테스트에 중요한 속성이있는 인스턴스를 요청할 수 있습니다.
예제 (홈페이지에서도) :
Factory.sequence :email do |n|
"somebody#{n}@example.com"
end
# Let's define a factory for the User model. The class name is guessed from the
# factory name.
Factory.define :user do |f|
# These properties are set statically, and are evaluated when the factory is
# defined.
f.first_name 'John'
f.last_name 'Doe'
f.admin false
# This property is set "lazily." The block will be called whenever an
# instance is generated, and the return value of the block is used as the
# value for the attribute.
f.email { Factory.next(:email) }
end
사용자가 필요한 경우 전화 할 수 있습니다
test_user = Factory(:user, :admin => true)
공장 프로토 타입에 지정된 모든 속성을 가진 사용자를 생성합니다. 제외하고 명시 적으로 지정한 관리자 속성의 경우. 또한 이메일 공장 방법은 호출 할 때마다 다른 이메일을 산출합니다.
나는 Java와 비슷한 것을 구현하는 것이 매우 쉽다고 생각하지만 휠을 재창조하고 싶지 않습니다.
추신 : Jmock과 EasyMoc에 대해 알고 있지만 여기서 조롱 프레임 워크에 대해 이야기하고 있지 않습니다.
해결책
이를위한 가능한 도서관 중 하나입니다 소스퍼.
그러나 생성하는 객체의 속성을 지정하려면 Java의 정적 타이핑은 프레임 워크를 무의미하게 만듭니다. 프레임 워크가 반사 또는 Java Bean 내성을 사용하여 속성 액세서를 찾을 수 있도록 속성 이름을 문자열로 지정해야합니다. 그것은 리팩토링이 훨씬 더 어려워 질 것입니다.
객체를 새로운 것을 새로 올리고 방법을 호출하는 것이 훨씬 간단합니다. 테스트에서 많은 보일러 플레이트 코드를 피하려면 테스트 데이터 빌더 패턴이 도움이 될 수 있습니다.
다른 팁
나는 또한 공장 소녀와 동등한 Java를 찾았지만 결코 그런 것을 찾지 못했습니다. 대신, 나는 처음부터 솔루션을 만들었습니다. Java에서 모델을 생성하기위한 공장 : 모델 시민.
Factory Girl에서 영감을 얻은 현장 주석을 사용하여 모델의 기본값을 설정하고 위키의 간단한 예:
@Blueprint(Car.class)
public class CarBlueprint {
@Default
String make = "car make";
@Default
String manufacturer = "car manufacturer";
@Default
Integer mileage = 100;
@Default
Map status = new HashMap();
}
이것은 자동차 모델의 청사진입니다. 이것은 새로운 인스턴스가 다음과 같이 생성 될 수있는 것보다 modelfactory에 등록됩니다.
ModelFactory modelFactory = new ModelFactory();
modelFactory.registerBlueprint( CarBlueprint.class );
Car car = modelFactory.createModel(Car.class);
클래스 대신 자동차 인스턴스를 전달하고 필요에 따라 값을 설정하여 자동차 모델의 값을 무시할 수 있습니다.
Car car = new Car();
car.setMake( "mustang" );
car = modelFactory.createModel( car );
그만큼 위키 더 복잡한 예제가 있습니다 (@Mapped 사용과 같은) 그리고 몇 가지 종과 휘파람에 대한 세부 사항.
- 나는 이것이 모든 사람을위한 것이 아니라 당신을 이해한다는 것을 이해합니다 ~할 수 있었다 Java 코드에 대해 Ruby 테스트 코드를 작성하십시오. (jtest)
- Java 에서이 작업을 수행하는 선호하는 방법은 테스트 데이터 빌더 무늬. 나는이 접근법이 프레임 워크 또는 외부 의존성의 복잡성을 도입하는 것을 실제로 보증하지 않는다고 주장한다. 프레임 워크를 사용하여 훨씬 덜 지정하고 더 많은 것을 얻을 수있는 방법을 알지 못합니다 ... Builder Syntax는 본질적으로 FactoryGirl 구문과 동일합니다. (누군가가 나를 자유롭게 설득 할 수 있습니다!)
나는 이것이 당신이 찾고있는 것이 아니라는 것을 알고 있습니다 ...
나는 과거에 반사를 사용하여 콩 값을 채우는 코드를 작성했습니다. 기본 아이디어는 모든 세터를 찾고 더미 값으로 각각 호출하는 것입니다. 내 버전은 모든 문자열을 필드 세트 이름의 이름으로 "이름"으로 호출 한 다음 모든 ints를 1로, 부울에서 true 등으로 설정합니다.
그런 다음 객체 마더 및 테스트 데이터 빌더와 유사한 패턴과 함께 이것을 사용했습니다.
테스트 데이터에 대한 좋은 시작을 제공했으며 특정 값이 필요한 필드는 테스트의 일부로 명시 적으로 설정할 수 있습니다.
도움이 되었기를 바랍니다.
동일한 질문으로 여기에 도착했으며 통합 테스트를 위해 데이터 생성 도구에 필요했습니다. 나는 그루비와의 도전을 받아들이기로 결정했다. 권력 주장.
방금 작은 도우미를 썼습니다 https://gist.github.com/pgaertig/9502960 아래와 같은 데이터 스크립트를 작성할 수있는 FactoryGrill;).
insert('MyTable', ID: 1, CREATED_AT: new Date(), NAME: 'Example text')
위는 다음과 같습니다.
INSERT INTO MyTable(ID, CREATED_AT, NAME) VALUES (1, ..current date here.., 'Example text')
그루비로 더 많은 일을 할 수 있습니다.
import org.apache.commons.lang3.RandomStringUtils;
for ( i in 0..9 ) {
insert('USERS', CREATED_AT: new Date(), EMAIL: "test${i}@mydomain.com",
SALT: RandomStringUtils.randomAlphanumeric(32));
}
load(new File('usersettings.groovy').text) //script nesting etc
공장이 그루비에서 상당히 직접적이기 때문에 실제로 공장이 아닙니다. 맵 생성자 또는 Expandos.
위의 ~ 30loc에서만 달성되기 때문에 FactoryGirl의 참조 및 기타 물건은 현재 사용할 수 없습니다. 그러나 내 솔루션에 관심이 있다면 Github에 전용 프로젝트를 추가하겠습니다.
모델 객체가 간단한 경우 프레임 워크를 사용하여이를 작성 해야하는 이유가 없습니다. 단순히 '새'연산자를 사용하십시오. 복잡한 모델 (복잡한 관계)이 있다면 Spring을 사용하여 함께 바인딩 할 수 있습니다 (테스트 시나리오에서도 스프링을 사용할 수 있음).
- 그러나 이것은 단순히 데이터 객체를위한 것입니다. 무언가를 수행하는 객체를 인스턴스화하는 것에 대해 이야기하는 경우 실제 인스턴스를 사용하는 대신 외부 관계를 조롱/스터브하는 것이 좋습니다.