【发布时间】:2020-04-30 14:39:02
【问题描述】:
我正在添加单元测试以涵盖遗留的 java 项目(我无法更改),
我知道如何对这个类进行单元测试和覆盖,我通过在下面添加单元测试来做到这一点。
public class Thing implements Serializable {
private static final long serialVersionUID = -1463850548670691860L;
private String id;
}
举个例子:
class ThingTest {
@Test
void testShouldNotChangeSerialVersionUID() throws NoSuchFieldException {
final Field serialVersionUID = Thing.class.getDeclaredField("serialVersionUID");
serialVersionUID.setAccessible(true);
assertEquals(-1463850548670691860L, getField(serialVersionUID, new Thing()));
}
}
但 sonar 和 jacoco 将 serialVersionUID 显示为未涵盖。这是声音。
您能否提出一个解决方案,通过覆盖该领域来使声纳满意。
是的,我知道,我不应该遵循工具,而是遵循实践。
其他约束,我无法更改 serialVersionUID 的可见性。
谢谢
【问题讨论】:
-
抱歉,这只是一个好奇:覆盖 serialVersionUID 有什么用处?
-
为该字段添加测试的作用是强制想要修改值的人也更改测试,因此阅读一条消息向他解释为什么需要三思而后行这样做,例如向后兼容
-
确保
serialVersionUID未被修改不会阻止用户以破坏序列化的方式修改类。如果您真的关心这一点,我建议将对象的序列化形式保存到资源文件中,将其添加到您的src/test/resources目录中,并编写一个测试以确保资源文件可以正确反序列化。 -
我同意你的观点,可以通过反射来做到这一点,我也对你提到的那个特定情况进行了单元测试。
-
你能用get方法包装它吗?
标签: java junit sonarqube code-coverage jacoco