You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 07:42:02