2011-01-18 5 views
14

article에서 정의 된 JpaDao 클래스의 매우 구체적인 예를 살펴보면Java에서 제네릭을 사용하여 클래스에 대해 쓸 단위 테스트는 무엇입니까?

public abstract class JpaDao<K, E> implements Dao<K, E> { 
    protected Class<E> entityClass; 

    @PersistenceContext 
    protected EntityManager entityManager; 

    public JpaDao() { 
     ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass(); 
     this.entityClass = (Class<E>) genericSuperclass.getActualTypeArguments()[1]; 
    } 

    public void persist(E entity) { entityManager.persist(entity); } 

    public void remove(E entity) { entityManager.remove(entity); } 

    public E findById(K id) { return entityManager.find(entityClass, id); } 
} 

응용 프로그램의 모든 기존 엔터티 (Order, Customer, Book 등)에 대한 단위 테스트를 작성하는 것이 가장 좋습니다. 또는이 other question에서 암시 한 단 하나의 엔티티에 대한 단위 테스트를 작성하는 것이 허용됩니까? 범용 클래스를 사용하여 Java 클래스를 테스트하는 것과 관련된 모범 사례가 있습니까?

답변

6

이 클래스를 서브 클래스 화하는 엔티티에 대한 추상 테스트 클래스를 작성할 수 있습니다.

예 : 당신이 일반적인 클래스가 구현

public abstract class JpaDaoTest<K,E> { 

    abstract protected E getEntity(); 
    abstract protected JpaDao getDAO(); 

    @Test 
    public void testPersistCreatesEntity() 
    { 
     JpaDao dao = getDAO(); 
     dao.persist(getEntity()); 
     // assert 
    } 
} 

계약이 제대로 그 getEntity() 세트를 가정하고 관계 의존성, 그냥 genericlly 테스트 할 수 있어야합니다.

따라서 일반 서브 클래스의 모든 테스트 케이스에 대해이 테스트 클래스를 서브 클래스 화하면 무료 테스트가 제공됩니다.

1

다른 엔티티 유형을 사용하면 다른 코드가 실행되므로 별도의 테스트 케이스가 필요합니다.

하나의 엔티티 유형 만 사용하는 공통 테스트 세트에서 최대한 많은 테스트를 거쳤습니다. 대부분의 코드가 모든 엔티티를 동일하게 취급한다면 두 번 이상 테스트 할 필요가 없습니다. 특정 엔티티 DAO가 다른 동작을하는 경우 필요한 특수 동작에 대해 별도의 테스트 케이스를 설정했습니다.

1
의 JUnit 자주 묻는 질문에서

: 나는 테스트해야 어떤 조건에서

4) (수)과() 메소드를 설정?

단위 테스트는 무언가가 망가질 수 있다는 두려움을 완화하기위한 것입니다. get() 또는 set() 메서드가 합리적으로 중단되거나 결함에 실제로 기여했다고 생각되면 모든 방법으로 테스트를 작성하십시오.

간단히 말해서 자신감이있을 때까지 테스트하십시오. 당신이 선택한 것은 당신의 경험과 신뢰 수준에 따라 주관적입니다. 실용적이고 테스트 투자를 극대화하십시오.

는 또한 상태 :

"테스트 두려움이 지루함으로 변할 때까지."

제네릭을 사용하지 않아도 질문이 동일하기 때문에 제네릭에만 해당되는 질문이라고 생각하지 않습니다. 이 경우 하나의 객체를 테스트하도록 선택할 것입니다 (테스트 목적으로 실제 또는 준비 됨). 문제를 발견하면 이러한 특정 결함을 해결하기위한 테스트를 작성하십시오.

0

형식의 의미와 관련하여 클래스의 동작을 테스트해야하는 경우 형식 불변성을 검사해야합니다. 즉, 모두 유형의 조합 (사용하지 않을 것으로 예상되는 것뿐만 아니라 아직 발명되지 않은 유형 포함)에 대한 몇 가지 주장을 설정하십시오.예를 들면 다음과 같습니다 상관없이의 주장이 보유 할 것으로 예상된다하는 어떤 종류의 KE

private <K, E> void testTypes(K k, E e) { 
    JpaDao<K, E> dao = new JpaDaoImpl<K, E>(); 

    dao.persist(e); 

    assertEquals(dao.getById(e.getId()).getClass(), e.getClass()); 
} 

@Test 
public void testIntegerAndOrder() { 
    this.<Integer, Order>testTypes(10, new Order()); 
} 

참조는합니다 (testIntegerAndOrder() 방법은 구체적인 유형 값을 사용하여이 주장을 테스트).

이것은 물론 특정 유형의 변수 값인에 대한 동작을 테스트하는 단위 테스트와 함께 사용해야합니다. 이것은 JUnit 튜토리얼에서 찾을 수있는 것과 똑같은 단위 테스트 일 것입니다. 의 정맥에 뭔가 :

@Test 
public void testDao() throws Exception { 
    JpaDao<Integer, Order> dao = getDao(); 

    Order order = ...; 
    order.setId(10); 

    dao.persist(order); 

    assertEquals(order, dao.findById(10)); 
} 

참조 주장의 의미는 여기에 다른 방법 :이 테스트 시험 저장된 객체가 변수 ID의 구체적인 값, 이전 테스트로하지 유형 변수를 사용하여 ID를 보유 주장.

1

BalusC와 마찬가지로 구체적인 구현을 테스트하는 것이 좋습니다. 그 이유는 "당신이 필요하지 않을 것"이라는 원칙에 부합하기 때문입니다. 구현하려는 유스 케이스가 통과 할 수 있도록 충분한 테스트를 추가하십시오. 그런 다음 유스 케이스를 추가 할 때 단위 테스트를 더 추가하십시오.

0

구체적인 클래스를 테스트하여 나중에 재정의 문제를 피하십시오.

일반적인 테스트를 만드는 것이 좋지만 안전하지는 않습니다.

개발 중에 단위 테스트의 대부분을 복사하여 나중에 테스트를 사용자 정의 할 수 있습니다.

관련 문제