2009-08-20 9 views
2

단위 테스트에서 사용할 개체를 만드는 factory 메서드가 있습니다. 이 객체들은 모두 동일한 기본 클래스에서 파생됩니다.Java에서 Class 객체로부터 익명 서브 클래스의 인스턴스를 만들 수 있습니까?

public static <T extends BaseEntity> T modMake(Class<T> clazz) 
{ 
    try { 
     return clazz.newInstance(); 
    } catch (InstantiationException e) { 
     // Should never happen 
     throw new AssertionError(e); 
    } catch (IllegalAccessException e) { 
     // Should never happen 
     throw new AssertionError(e); 
    } 
} 

이제는 해당 기본 클래스의 getter 메서드를 오버라이드하고 싶습니다. 테스트 용입니다. 나는 보통, 익명 클래스와 그렇게 할 것 (BaseEntity의 subtaypes 중 하나 인 Node) 예를 들어 :

public static Node nodMake() 
{ 
    return new Node() { 
     @Override 
     public long ixGet() { return 1; } 
    }; 
} 

내가 할 수있는, 너무 Class 인수를 사용하여 함수에서?

답변

3

팩토리 메소드를 잃고 EasyMock과 같은 조롱 API를 사용하여 설명하는 동작을 달성하십시오.

코드는 다음과 같이 뭔가를 끝낼 것

long returnValue = 12; 

Node nodeMock = createMock(Node.class); 
expect(nodeMock.ixGet()).andReturn(returnValue); 
replay(nodeMock); 

//add test code here 

verify(nodeMock); 

이 어떻게 작동하는지에 한노의 질문에 대답하기 :

그것은 당신이 인터페이스 또는 클래스를 조롱 여부에 따라 달라집니다.

인터페이스의 경우은 간단합니다 (코드별로), 핵심 Java의 일부인 동적 프록시라고하는 것을 사용합니다.

클래스의 경우은 @Jonathan이 멋진 API 바로 뒤에있는 그의 답변에서 언급 한 바이트 코드 조작을 수행하고 있습니다.

위의 메커니즘을 사용하면 메서드 호출을 가로 채기가 가능하며 EasyMock은 설정 한 기대에 따라 간단히 응답합니다.

+0

흥미 롭습니다. 저는 아직 Java를 사용하지 않았습니다. –

+0

저는 이제 EasyMock을 실제로 사용하고 있습니다. 감사! –

0

나는 그렇게 할 방법이 없다고 생각합니다. 실제로 해당 경로를 사용해야하는 경우 바이트 코드 조작기를 조사해야합니다. Javassist와 BCEL은 몇 가지 선택 사항입니다.

관련 문제