2014-04-11 2 views
1

Generics를 메소드 인수로 사용하여 메소드 인수를 테스트 할 수있는 방법은 무엇입니까? AbstractTO를 확장하는 클래스가 아래 방법에 전달되는 경우일반 테스트 메소드 인수

public class AbstractServiceClient(){ 
    public constructBusinessClient(String serviceName, String clientName, Class<? extends AbstractTO> requestClass, AbstractTO serviceRequestTO){ 
    constructBusinessServicesRestClientProperties(servicename, clientName, requestClass, servicerequestTO); 
    } 

// 확인하는 테스트 케이스를 쓰기 (클래스 requestClass)

public BusinessServicesRestClient constructBusinessServicesRestClientProperties(String serviceName,String clientName, Class<? extends AbstractTO> requestClass 
     , AbstractTO serviceRequestTO){ 
     //set values 
    } 
    } 

    public class AbstractServiceClientTest { 

    private Class<? extends AbstractTO> requestClass; 
    private static final String CLIENT_NAME = "clientName"; 
    private AbstractTO serviceRequestTO ; 
    private AbstractServiceClient abstractServiceClient; 

@Test 
public void constructBusinessServiceClientShouldSetCorrectClientName() { 
abstractServiceClient.constructBusinessClient(operation,clientName, requestClass, abstractClass);   
abstractServiceClient.constructBusinessServicesRestClientProperties(any(String.class), eq(CLIENT_NAME), requestClass, any(AbstractTO.class)); 
    } 
    } 
@Test 
public void constructBusinessServiceClientShouldSetCorrectRequestClass() { 
abstractServiceClient.constructBusinessClient(operation,clientName, requestClass, abstractClass);   
abstractServiceClient.constructBusinessServicesRestClientProperties(any(String.class), eq(CLIENT_NAME), eq(requestClass), any(AbstractTO.class)); 
    } 
    } 
} 
+2

나는 당신이 무엇을 요구하고 있는지 전혀 모른다. 귀하의 질문에서 어떤 부분이 시험을 받아야합니까? 어느 부분이 제네릭일까요? –

+0

나는 당신이 쓰고 싶은 언어 또는 당신이 쓰는 언어를 이해하지 못한다. – Dima

+0

업데이트 된 코드를 참조하십시오. – user679526

답변

0

이 질문은 너무 막연한 조금 할 수있을 것입니다 코드를 답으로 만들지 만 근본적으로 문제가 특정 매개 변수와 함께 B 클래스의 메서드 A이 호출되도록하려면 D 클래스의 C 메서드를 호출 할 때 일반적으로 수행해야 할 작업은 다음과 같습니다.

  1. B의 모의 객체를 만들어 상호 작용을 확인하십시오.
  2. 실제로 테스트 할 클래스 D의 실제 개체를 만듭니다.
  3. 아무렇지도 않게 너의 실제 물건 D에 너의 모의 B를 주사해라. 이 작업은 D의 생성자를 통해 수행 할 수 있습니다.이 경우이 단계는 2 단계의 일부가됩니다.
  4. 필요한 모든 인수를 전달하여 C 메서드를 호출합니다.
  5. 메서드가 호출되었는지, 모의 개체의 올바른 인수와 함께 확인하십시오.

A 메서드의 반환 값이 D 클래스의 작동에 중요 할 경우 대신 다음과 같이 작동합니다.

  1. B의 모의 객체를 만들어 상호 작용을 확인하십시오.
  2. 실제로 테스트 할 클래스 D의 실제 개체를 만듭니다.
  3. 아무렇지도 않게 너의 실제 물건 D에 너의 모의 B를 주사해라. 이 작업은 D의 생성자를 통해 수행 할 수 있습니다.이 경우이 단계는 2 단계의 일부가됩니다.
  4. 스텁 메서드 A 올바른 인수를 사용하여 호출 할 때 적절한 반환 값이 반환되도록합니다.
  5. 필요한 인수를 전달하여 C 메서드를 호출하십시오.
  6. 의 개체 상태를 확인하여 A의 반환 값이 해당 상태에 올바른 영향을 주는지 확인하십시오. D의 상태가 올바르지 않으면 D이 반환을 올바르게 처리하지 못하거나 A 메서드를 호출하지 않았거나 잘못된 메서드를 사용하여 A 메서드를 호출했습니다.

이 두 번째 경우에는 모의를 검증하고 스터 빙할 필요가 없습니다. 비웃는 주부들은 당신에게 스텁 또는 검증을해야한다고 말하지만 결코 그렇지는 않습니다.

이제 질문에서 코드를 보면 필요한 단계를 수행 한 것이 아닌 것 같습니다. 따라서이 "테스트 케이스"는 아무 것도하지 않을 것입니다. "효과가있다"고 생각하더라도 아무 것도 테스트하지 않았습니다.

Mockito의 사용에 관한 한, matcher 중 하나를 사용하여 메소드를 스텁하거나 확인하는 메소드 호출을 사용합니다. 따라서 위에서 설명한 두 시나리오 중 하나에서 코드를 사용할 수 있습니다.

하지만 둘 중 하나를 수행해야합니다. 그래서 당신이 확인하는 경우, 당신은

verify(mockAbstractServiceClient).constructBusinessServicesRestClientProperties(anyString(), eq(CLIENT_NAME), eq(SomeConcreteTO.class), any(AbstractTO.class)); 

을 작성할 수 있습니다 또는 스텁하는 경우, 당신은 whenthenReturn를 사용하여, 물론,이 글을 쓰는 또 다른 방법이있다

doReturn(someValue).when(mockAbstractServiceClient).constructBusinessServicesRestClientProperties(anyString(), eq(CLIENT_NAME), eq(SomeConcreteTO.class), any(AbstractTO.class)); 

작성할 수 있습니다, 하지만 doReturn을 사용하는 것이 더 직관적이라고 생각합니다.

두 가지 모두에서 나는 개체 주위에 eq을 사용했습니다. 메소드에 전달되는 클래스인지 확인하는 방법입니다.