如何为Maven Enforcer插件自定义规则编写单元测试(仓库模拟)
Maven Enforcer自定义规则单元测试(支持真实/Mock仓库)
下面分两种场景给出具体实现方案:
一、Mock仓库场景(快速验证规则逻辑)
借助Mockito框架Mock RepositorySystem 接口,模拟依赖解析结果,无需真实仓库环境。
1. 测试依赖准备
在项目pom.xml中添加测试依赖:
<dependencies> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>4.11.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-junit-jupiter</artifactId> <version>4.11.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.maven.enforcer</groupId> <artifactId>enforcer-api</artifactId> <version>3.3.0</version> <scope>test</scope> </dependency> </dependencies>
2. 单元测试代码示例
@ExtendWith(MockitoExtension.class) class MyRuleTest { @Mock private RepositorySystem repositorySystem; @InjectMocks private MyRule myRule; @Test void testDependencyCollectionWithMock() { // 模拟依赖解析返回的Artifact Artifact mockArtifact = Mockito.mock(Artifact.class); when(mockArtifact.getGroupId()).thenReturn("com.example"); when(mockArtifact.getArtifactId()).thenReturn("test-lib"); when(mockArtifact.getVersion()).thenReturn("2.0.0"); ArtifactResult mockResult = Mockito.mock(ArtifactResult.class); when(mockResult.getArtifact()).thenReturn(mockArtifact); // 模拟RepositorySystem的resolveDependencies方法 when(repositorySystem.resolveDependencies(any(RepositorySystemSession.class), any(DependencyRequest.class))) .thenReturn(Collections.singletonList(mockResult)); // 执行自定义规则 myRule.execute(); // 验证规则逻辑是否符合预期(示例:检查是否正确识别了模拟依赖) // 此处替换为你的业务断言,比如: // assertEquals(1, myRule.getCollectedDependencies().size()); } }
二、真实仓库场景(验证真实依赖解析)
使用Maven原生的DefaultRepositorySystem实现,配置本地/远程仓库,测试真实依赖收集逻辑。
1. 单元测试代码示例
class MyRuleRealRepoTest { private MyRule myRule; private RepositorySystem repositorySystem; @BeforeEach void setUp() throws Exception { // 初始化真实的RepositorySystem实例 repositorySystem = new DefaultRepositorySystem(); // 配置仓库会话 DefaultRepositorySystemSession session = new DefaultRepositorySystemSession(); // 设置本地测试仓库路径 LocalRepository localRepo = new LocalRepository("target/test-local-repo"); session.setLocalRepositoryManager(repositorySystem.newLocalRepositoryManager(session, localRepo)); // 配置远程仓库(以Maven中央仓库为例) RemoteRepository centralRepo = new RemoteRepository.Builder("central", "default", "https://repo1.maven.org/maven2/").build(); session.setRemoteRepositories(Collections.singletonList(centralRepo)); // 将RepositorySystem注入自定义规则(若规则用@Inject,也可通过CDI容器初始化) myRule = new MyRule(); Field repoSystemField = MyRule.class.getDeclaredField("repositorySystem"); repoSystemField.setAccessible(true); repoSystemField.set(myRule, repositorySystem); // 按需设置规则的其他依赖(比如RepositorySystemSession) // Field sessionField = MyRule.class.getDeclaredField("session"); // sessionField.setAccessible(true); // sessionField.set(myRule, session); } @Test void testDependencyCollectionWithRealRepo() { // 执行自定义规则 myRule.execute(); // 断言真实依赖收集结果符合预期 // 示例:assertEquals("com.example:test-lib:2.0.0", myRule.getCollectedDependencies().get(0).toString()); } }
注意事项
- 真实仓库测试受网络影响,建议配合本地缓存或在CI环境中开启离线模式
- 测试后可清理
target/test-local-repo目录,避免占用磁盘空间
内容的提问来源于stack exchange,提问作者dzav
相关产品推荐
相关产品推荐

