2011-03-24 1 views
8

클래스/라이브러리의 두 버전을 비교하여 호출하는 코드가 손상 될 수있는 변경 사항이 있는지 확인할 수 있기를 원합니다. 메소드 서명/필드에서 비 호환성을 찾는 도구

public String readWidget(Object widget, Object helper); 

와 방법 B 버전

이된다 : 예를 들어 버전 A의 방법을 가지고 몇 가지 클래스 푸 고려

public String readWidget(Object widget); //removed unnecessary helper object 

또는 필드의 경우 비슷한 :

version a: public static Object sharedFoo; 
version b: static Object sharedFoo; //moved to package private for version b 

나는 이러한 변경 사항을 잠재적 인 비 호환성으로 표시 할 도구를 원합니다. (그러나 반대로는 메서드의 가시성을 높이는 것이 이상적이지는 않습니다.) 이제는 반사를 통해 또는 javap의 출력을 분석하여이 작업을 수행 할 수 있음을 알고 있지만 기존 도구 (비공식적 인 것이 좋음)가 있어야하는 것처럼 보입니다. 그래서 필자는 휠을 불필요하게 재발 명하기 전에 실수로 뭔가를 추천 할 수 있는지 알아보기를 원했습니다.

답변

2

구아바는 을 사용하여 version changes을 신고합니다. 유용 할 수도 있습니다.

+0

이것이 정확히 내가 찾고있는 것이지 확실하지는 않습니다. 나는 또한 japitools를보고있다. –

3

질문을 이해하지 못할 수도 있지만이 문제를 해결할 정확한 도구는 컴파일러가 아닙니다.

Foo을 사용하는 클래스를 Foo의 새 버전과 비교하여 다시 컴파일하면 비 호환성 문제가있을 때 매우 빨리 밝힙니다.

+1

귀하의 진술은 사실이지만 외부 리소스에 제공되는 클래스이므로 컴파일러가 고장 나면 불만을 토로하고 그 사실을 알려주지 않을 것입니다. 호환성은 호환성을 깨뜨리지 않고 기본적으로 사용 중단 될 수있는 충분한 시간을 보장하여 호환성을 깨뜨리는 것입니다. 즉, 컴파일러 오류가 발생하기 전에 예방 분석을 수행하고 싶습니다. –

2

여기 당신이 원하는하지 않은 대답은, 그러나 나는 그것이 올바른 해답이라고 생각 :

  1. 은 (이미 오른쪽이가 당신의 API의 모든 하나의 메소드를 호출하는 단위 테스트 스위트를 쓰기? -)).
  2. API를 변경하면 API의 새 버전을 다시 컴파일하지만 단위 테스트는 다시 컴파일하지 마십시오.
  3. "오래된"단위 테스트 집합을 "신선한"API에 대해 실행하십시오. 시험이 오래된 세트는 API의 클라이언트에있을 것입니다 상황을 흉내 낸, 카나리아된다.

문제가 단지 모든 클라이언트 코드이 가능하지 않을 수도 있다는 점이다 을 재 컴파일. 코드는 당신 소유가 아닐 수도 있습니다. 고객 중 한 명이 작성하고 사용할 수없는 사용자 정의 코드 일 수 있습니다.

두 번째 클라이언트 코드를 다시 컴파일 할 때의 문제는 경우에 따라 호출 코드를 변경하지 않아도 컴파일 오류가 발생하지 않는 경우가 있습니다. 이런 문제가 한 번 만났습니다. 다음과 같은 API 메소드가 있습니다.

public void doSomething(){ 
} 

코드와 연결된 코드가 있습니다. 나는 이것을 다음과 같이 바꾸고 싶었다 :

public boolean doSomething() { 
} 

나는 그렇게했고 재 컴파일했다. doSomething()의 첫 번째 버전을 호출 한 코드가 새 버전에 자동으로 다시 연결되기 때문에 오류가 발생하지 않았습니다 (Java에서 유효한 반환 값 제외).그러나 내가 다시 컴파일했을 때 이 외부 클래스의 바이트 코드를 변경한다는 것을 알지 못했습니다. API가 업데이트되었지만 API를 사용하는 코드가 다시 컴파일되지 않은 경우 오류가 발생하기 시작했습니다.

그래서 오류를 찾는 대신 결과적으로 어떤 외부 파일의 바이트 코드가 변경되었는지 확인해야합니다. 이 시점에서 필자는 필자가이 글을 쓸 필요가 있기 때문에 단위 테스트를 사용해야한다고 말하고 싶다.