다중 모듈 Maven 프로젝트의 모듈간에 src / test 클래스 공유


120

다중 모듈 Maven 프로젝트가 있습니다. 이 예제를 위해 두 개의 모듈을 고려하십시오.

  • data
  • consumer

모듈 consumer에는 data종속성으로 모듈 이 있습니다.

모듈 data은 여러 핵심 클래스를 선언합니다. src/test그것들을 사용하는 테스트가 있습니다. 이 테스트에는 오랜 시간이 걸리는 객체 생성이 필요하므로 이러한 객체를 생성하는 유틸리티 메서드가 포함 된 클래스가 있습니다. 이 유틸리티 클래스 ( SampleDataHelper)는 src/test계층 구조에 있습니다.

또한 consumer이러한 장황한 개체 중 일부를 만들어야 하는 모듈에 몇 가지 테스트가 있습니다. 내 트리 에있는 테스트 SampleDataHelper에서 클래스 (에 정의 됨 data src/test) 를 사용하고 싶습니다 consumer src/test. 불행하게도, 비록 data의 종속성입니다 consumer, consumer그 아래에있는 클래스를 볼 수 없습니다 data src/test.

이 문제를 해결하기 위해 다른 모듈 ( data-test)을 만들고 SampleDataHelper아래 로 이동할 수 있다고 생각 했습니다 src/main. 그럼이 포함됩니다 data-testA와 시험 범위 의 의존성 data. : 불행하게도,이 순환 종속성이 소개 data사용을 data-test하지만, data-test또한 필요합니다 data.

내가 생각 해낸 유일한 해결책 은 패키지 SampleDataHelper아래 data src/main에 배치 하고 test실제 애플리케이션 코드가이를 호출하지 않기를 바라는 것입니다.

SampleDataHelper클래스를 아래에 두지 않고 모듈간에 공유하려면 어떻게 해야 src/main합니까?


1
이 답변을 확인하십시오 . 나는 그것이 당신을 도울 것이라고 생각합니다.
Andrew Logvinov 2013


@AndrewLogvinov : 연결된 답변에 "2 단계"빌드가 필요하지 않습니까? 두 번째 모듈 ( )을 컴파일하기 전에 먼저 하나의 모듈 ( )을 빌드하고 배포 합니다. dataconsumer
그렉 Kopff

사용하면 몇 가지 문제가 발생할 있다고 생각 mvn package하지만 mvn install또는 사용하면 단일 단계 빌드에서 잘 작동 mvn deploy합니다. 간단한 메모입니다. 우리의 큰 프로젝트 중 하나에서 우리는 junit에 대한 래퍼를 가지고 TestBase있으며 src/main그것은 나도 좋은 생각이라고 생각하지 않는 위치에 있습니다.
Andrew Logvinov 2013

답변:


152

소비자 프로젝트는 데이터 프로젝트에 의존하므로 소비자보다 먼저 데이터를 구축해야합니다. 결과적으로 의견에 제안 기술을 사용 하여 데이터 프로젝트에 공유하려는 모든 테스트 코드가 포함되어 있는지 확인하고 테스트 JAR을 생성하도록 POM을 구성합니다.

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <version>2.2</version>
  <executions>
    <execution>
      <goals>
        <goal>test-jar</goal>
      </goals>
    </execution>
  </executions>
</plugin>

컨슈머 프로젝트는 일반적인 데이터 JAR ​​아티팩트와 추가 test-jar아티팩트 모두에 의존하며 물론 테스트 범위는 다음과 같습니다.

<dependency>
  <groupId>com.foo</groupId>
  <artifactId>data</artifactId>
  <version>1.0</version>
  <type>test-jar</type>
  <scope>test</scope>
</dependency>

이 접근 방식을 여러 번 사용해 왔으며 잘 작동합니다.


1
"사용자 프로젝트는 일반 데이터 JAR ​​아티팩트와 추가 테스트 jar 아티팩트"부분에 모두 의존합니다. 데이터의 종속성을 모두 소비자에 추가 할 때 (데이터 및 소비자라는 아티팩트라고 가정 해 보겠습니다) pom, 특정 버전 사양이 없으면 pom에 오류가 발생했습니다. 왜 그럴까요?
Johnny

@StasS는 아마도 그것에 대해 별도의 질문을 여는 것이 가장 좋습니다.
Duncan Jones


1

그래서 문제는 data모듈의 (일부) 테스트 가 SampleDataHelper클래스에 의존한다는 것 입니까? 당신은 움직일 수 SampleDataHelper에 클래스 src/maindata-test같은 시간에 당신이에 (특정 클래스에 따라 다릅니다) 테스트를 이동하는 경우, 모듈 src/testdata-test모듈. 결과적으로 더 이상 순환 종속성이 없습니다.


1
내가 당신을 이해한다면, 당신은 사용하는 테스트가 있음을 시사하고 SampleDataHelper중 하나에서 이동 data모듈이나 consumer에 (적절한) 모듈 data-test. 불행히도 저는 이것이 테스트하는 모듈에서 다른 모듈로 테스트를 이동시키기 때문에 이것이 매우 "순수한"솔루션이라고 생각하지 않습니다. (엄밀히 말해서, 당신은 data테스트 를 옮기라고 말 했지만 일관성을 위해 둘 다 움직일 것이라고 생각합니다). 그러나 귀하의 답변에 감사드립니다. :-)
Greg Kopff 2013

1
네, 당신은 나를 올바르게 이해했습니다. 그리고 틀림없이 깔끔한 것보다 빠른 솔루션입니다. :-)
matsev

나는 순환 의존성이 남아있을 것이라고 상상할 것입니다. 문제의 테스트가 데이터 프로젝트에 정의 된 클래스를 실행한다고 가정하면 데이터 테스트 프로젝트에서 데이터 프로젝트에 대한 다시 참조가 필요합니다.
Duncan Jones

1
@DuncanJones 죄송합니다. 게시물에 작은 오타가 있습니다. 제가하려는 요점은 data-test모듈이 모듈에 의존해야 한다는 것입니다 data(반대가 아닌). 순환 종속성을 방지하려면를 data사용하는 모듈에 현재 상주하는 모든 테스트를 모듈 SampleDataHelper로 이동해야합니다 data-test.
matsev 2013

알겠습니다.
Duncan Jones
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.