「讨论」重构单元测试,改变了字段 #12931 的修饰符

搬运君又来搬运优质的 Discussions 啦,来源于 GitHub TeslaCN

TeslaCN:


大家好

由于最新的 LTS Java 17 已经发布,所以最好支持
用 JDK 17 构建 ShardingSphere。我已经升级了一些插件来
支持 Java 17,但仍然存在一些问题。

在一些单元测试中,我们
像下面的代码那样通过反射来改变 Field 的修饰符,这是从 Java 12 开始不允许的。它会
导致java.lang.NoSuchFieldException: modifiers .

private static void setFinalStatic(final Field field, final Object
newValue) throws NoSuchFieldException, IllegalAccessException {
    field.setAccessible(true);
    Field modifiersField = Field.class.getDeclaredField("modifiers");
    modifiersField.setAccessible(true);
    modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
    field.set(null, newValue);
}

临时解决方案是忽略
在使用 Java 12 或更高版本时更改 Field 修饰符的测试:
shardingsphere/shardingsphere-infra/shardingsphere-infra-executor/pom.xml

Lines 64 to 85 in ebe58d2

 <profiles> 
     <profile> 
         <id>jdk12+</id> 
         <activation> 
             <jdk>[12,)</jdk> 
         </activation> 
         <build> 
             <plugins> 
                 <plugin> 
                     <groupId>org.apache.maven.plugins</groupId> 
                     <artifactId>maven-surefire-plugin</artifactId> 
                     <configuration> 
                         <excludes> 
                             <!-- TODO Consider refactoring tests which changed Field's modifiers --> 
                             <exclude>org.apache.shardingsphere.infra.executor.sql.log.SQLLoggerTest</exclude> 
                         </excludes> 
                     </configuration> 
                 </plugin> 
             </plugins> 
         </build> 
     </profile> 
 </profiles> 

我对这个问题有两个想法:

  1. 像这样重构测试:https : //stackoverflow.com/a/69418150/7913731
  2. PowerMock 重构测试。

我想就这个问题征求意见。

已发送有关此讨论的电子邮件:https :
//lists.apache.org/thread.html/r944c3deb27755cb3e0314fea40aa366b7e7c4ea5c6388cd5fa5febcd%40%3Cdev.shardingsphere.apache.org%3E


为了中文开发者更好的查阅,讨论已经翻译成中文

详情链接点击 这里

京ICP备2021015875号