JMockit使用实例<四>mock某个类的常量值

本文介绍了如何在单元测试中使用mock常量,并通过示例代码展示了如何修改类的静态常量来验证测试逻辑。
  • 关键词:mock 常量的mock
  • 源类清单
    public static class ClassWithConstant {
            private static final Integer ANSWER = 42;
     
            public static final int getAnswer() {
                return ANSWER;
            }
        }
  • 单元测试类清单
    public class ClassWithConstantTest {
     
     
        @Test
        public void test() {
            killThreadLocal(ClassWithConstant.class.getName(),"ANSWER");
            Deencapsulation.setField(ClassWithConstant.class, 43);
            assertEquals(43, new ClassWithConstant().getAnswer());
        }
     
        //use reflection to remove the final modifier first
        private void killThreadLocal(String klazzName, String fieldName) {
            try{
            Field field = Class.forName(klazzName).getDeclaredField(fieldName);
            field.setAccessible(true);
            Field modifiersField = Field.class.getDeclaredField("modifiers");
            modifiersField.setAccessible(true);
            int modifiers = modifiersField.getInt(field);
            modifiers &= ~Modifier.FINAL;
            modifiersField.setInt(field, modifiers);
            field.set(null, null);
            }catch(Exception e){
     
            }
    }
    }
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-core</artifactId> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.8.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>5.8.2</version> <scope>test</scope> </dependency> <!-- Mockito 模拟框架 --> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-junit-jupiter</artifactId> <scope>test</scope> </dependency> <!-- Spring Data JPA --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!-- MySQL Connector --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> </dependencies> 加了这些依赖还有报错Could not initialize plugin: interface org.mockito.plugins.MockMaker
最新发布
08-22
根据你提供的依赖配置,虽然排除了 `spring-boot-starter-test` 中的 `mockito-core`,但仍然显式引入了 `mockito-junit-jupiter`,这可能导致 Mockito 版本冲突或缺少必要的插件依赖。以下是具体分析和解决方案: --- ### **问题分析** 1. **依赖冲突** - 你排除了 `spring-boot-starter-test` 中的 `mockito-core`,但单独引入了 `mockito-junit-jupiter`。 - 如果 `mockito-junit-jupiter` 的版本与 Spring Boot 管理的 Mockito 版本不一致(例如 Spring Boot 3.x 默认使用 Mockito 4.x,而你显式引入了其他版本),会导致插件初始化失败。 2. **缺少 `byte-buddy`** - Mockito 依赖 `byte-buddy` 或 `cglib` 生成 mock 对象,但你的配置中未显式声明这些依赖。 3. **未配置 `MockMaker` 插件** - 如果测试中使用了需要动态 mock 的功能(如 `@MockBean`、`Mockito.mock()`),但未配置 `mock-maker-inline`,可能会触发此错误。 --- ### **解决方案** #### **1. 统一 Mockito 版本** - **移除显式的 `mockito-junit-jupiter` 依赖**,让 Spring Boot 管理版本: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <!-- 移除 exclusions 或确保版本一致 --> </dependency> ``` - **如果必须显式引入 Mockito**,确保版本与 Spring Boot 兼容: ```xml <properties> <mockito.version>4.5.1</mockito.version> <!-- 与 Spring Boot 3.x 兼容 --> </properties> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-junit-jupiter</artifactId> <version>${mockito.version}</version> <scope>test</scope> </dependency> ``` #### **2. 显式添加 `byte-buddy`** Mockito 需要字节码操作库来生成 mock: ```xml <dependency> <groupId>net.bytebuddy</groupId> <artifactId>byte-buddy</artifactId> <version>1.14.4</version> <!-- 最新稳定版 --> <scope>test</scope> </dependency> ``` #### **3. 配置 `MockMaker` 插件** 在 `src/test/resources/mockito-extensions` 目录下创建文件 `org.mockito.plugins.MockMaker`,内容为: ``` mock-maker-inline ``` 这会强制 Mockito 使用支持静态方法和 final 的 `mock-maker-inline`。 #### **4. 检查重复依赖** 运行以下命令检查依赖树,确保没有多个 Mockito 版本: ```bash mvn dependency:tree | grep mockito ``` 如果发现冲突,通过 `<exclusions>` 排除旧版本。 --- ### **修复后的依赖配置示例** ```xml <dependencies> <!-- Spring Boot Starter 依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- MySQL --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- Lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!-- 测试相关依赖(显式声明版本以避免冲突) --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.8.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>5.8.2</version> <scope>test</scope> </dependency> <dependency> <groupId>net.bytebuddy</groupId> <artifactId>byte-buddy</artifactId> <version>1.14.4</version> <scope>test</scope> </dependency> </dependencies> ``` --- ### **验证步骤** 1. 清理项目并重新构建: ```bash mvn clean install ``` 2. 运行测试,确认错误是否消失。 3. 如果仍有问题,检查测试代码中是否隐式使用Mockito(如 `@MockBean` 或 `Mockito.mock()`),并确保测试正确注解(如 `@ExtendWith(MockitoExtension.class)`)。 --- ### **总结** 1. **避免显式引入 `mockito-junit-jupiter`**,除非需要特定版本,否则让 Spring Boot 管理依赖。 2. **显式添加 `byte-buddy`** 以确保 Mockito 能生成 mock。 3. **配置 `mock-maker-inline`** 以支持高级 mock 功能。 4. **检查依赖冲突**,确保没有多个 Mockito 版本共存。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值