2011-03-08 2 views
5

소스 코드를 잃어버린 병이 있습니다. 항아리를 디 컴파일하고 새로운 항아리를 만들었습니다. 그런 다음 소스 코드와 이전 jar가 동일한 동작을하는지 확인하려고합니다. 나는 단위 테스트를 작성하여 문제가 그들 둘 다 동일한 네임 스페이스/클래스 이름을 갖기 때문에 오래된 jar와 새로운 소스 코드를 모호하게하는 방법을 모르겠다. 나는 무엇을 할 수 있습니까, 불가능합니까?Java : 네임 스페이스 충돌 해결

답변

3

해당 코드 버전을 실행하는 것을 보장하려면 클래스 경로에 한 번만 있어야합니다. 코드와 별도로 단위 테스트를 개발하여 어느 버전 으로든 드롭 할 수 있습니다.

+0

나는 이것을 할 필요가 없길 희망했지만, 그것은 유일한 apporach처럼 보입니다. – Bishnu

1

새로운 소스에 테스트 용으로 임시 네임 스페이스를 지정하십시오.

com.yourfirm.test.packagename.TheClassName 

오래된 것들은 단순히 TheClassName로 가져온 대해 참조 할 수 있습니다 : 그럼 대신 수입, 당신은 귀하의 새로운 클래스를 참조 할 수 있습니다. 이 방법을 통해 테스트 사례를 살펴봄으로써 알 수 있습니다.

또는 단순히 -cp oldpackage.jar 및 다음으로 -cp newpackage.jar으로 테스트를 실행하십시오.

+0

테스트에서 빌드 코드를 자동화해야하므로이 작업을 수행 할 수 없습니다. – Bishnu

0

클래스 패스를 사용하여 런타임에 테스트 할 클래스를 변경했습니다. 이 방법은 두 바이너리 모두에 대해 동일한 테스트 코드를 실행한다는 점에서 오류가 발생하기 쉽습니다. 그렇지 않으면 테스트가 올바른지에 대해 더 많은 복잡성이 생깁니다.

0

동시에 두 항아리 모두에 대해 테스트를 실행하려는 것 같습니다. 클래스 패스에 둘 다 있다면 이전/새로운 항아리를 모호하게하는 방법을 모르겠습니다.

출력 결과를 stdout/stderr로 테스트하는 경우 원래 jar에 대해 테스트를 실행하고 결과를 저장할 수 있습니다. 그런 다음 새 jar에 대해 테스트를 실행하고 결과를 별도의 파일에 저장하십시오. 그런 다음 파일을 diff하십시오.

또 다른 접근법은 고유 한 네임 스페이스를 갖도록 새 소스 코드를 리팩토링하는 것입니다. 그런 다음 두 항아리를 동시에 테스트 할 수는 있지만 기존 항아리를 사용하도록하는 작업이 많이 필요할 수 있습니다.

1

가능한 일이지만 클래스 로딩을해야합니다. 항아리 중 하나를 클래스 경로에 배치하는 대신 런타임에로드해야합니다. 도서관에서 이것을 할 수 있도록 JCL을 확인하십시오. (부인 : 나는 JCL을 사용한 적이 없다.)

기본적으로 각 테스트는 이전 JAR에서 클래스를로드하고 테스트중인 메소드의 결과를 가져온 다음 해당 JAR을 언로드하고 새 JAR를로드한다. 새 버전에 대해 동일한 메소드를 실행하고 결과를 비교하십시오.

0

ant (Junit-task)를 통해 테스트를 실행하는 경우 두 클래스의 실행에 대해 개별적으로 앤트 클래스 경로를 제어 할 수 있습니다 (jar를 통해 한 번, 클래스의 파일 세트를 통해 한 번).

관련 문제