为什么伴随对象不作为 JUnit 测试的私有字段进行测试?
Why does a companion object not test as private field with JUnit tests?
我最近不得不在 Kotlin 中做一个编程练习 class。我们使用与 Java 课程相同的 JUnit 测试,有时这会导致一些奇怪的问题。
在这种情况下,我们应该有一个 class 和一个我们可以从另一个 class 访问的静态方法。由于 Kotlin 中没有静态方法,我们将使用带有注解 @JvmStatic 的伴生对象,如下所示:
companion object{
@JvmStatic
fun parseRationalNumber[...]{
...}
}
这很好用。然而,由于我真的不知道自己在做什么,所以我最终将我的伴生对象命名为:
companion object Parser{
@JvmStatic
fun parseRationalNumber[...]{
...}
}
一切仍然有效,但这最终破坏了我们的一个自动化 JUnit 测试,该测试将检查我们是否正确解决了练习:
@Test
void testAllFieldsPrivate() {
Field[] fields = RationalNumber.class.getDeclaredFields();
for (Field field: fields) {
assertTrue(Modifier.isPrivate(field.getModifiers()) || "Companion".equals(field.getName()),
"The RationalNumber class should have only private instance variables.");
}
}
当我搜索非私有字段时,这给了我很长一段时间的问题。最后我把测试弄乱了一点,发现它有问题的字段叫做“解析器”,这是我的伴随对象的名称。
当我问我的教授为什么会这样时,他无法给我答案,所以我想我应该在这里问。有谁知道为什么将命名的伴随对象作为非私有字段进行测试?
当我现在看时,测试似乎为名为“Companion”的伴随对象破例,我认为它是未命名伴随对象的默认名称。有人知道为什么这会作为非私人领域进行测试吗?
很简单,因为任何未声明为私有的字段都不是私有的。伴生对象也不例外。你需要做
private companion object{
}
为此
伴随对象根本不是私有的,除非被标记为私有。
因此,测试实际上明确排除了伴生对象,但他们以一种非常脆弱的方式进行。不要使用默认的“Companion”名称,测试还应该使用反射来获取伴随对象的实际名称。
问题是测试很可能正在使用 Java 反射,并且无法访问
我最近不得不在 Kotlin 中做一个编程练习 class。我们使用与 Java 课程相同的 JUnit 测试,有时这会导致一些奇怪的问题。
在这种情况下,我们应该有一个 class 和一个我们可以从另一个 class 访问的静态方法。由于 Kotlin 中没有静态方法,我们将使用带有注解 @JvmStatic 的伴生对象,如下所示:
companion object{
@JvmStatic
fun parseRationalNumber[...]{
...}
}
这很好用。然而,由于我真的不知道自己在做什么,所以我最终将我的伴生对象命名为:
companion object Parser{
@JvmStatic
fun parseRationalNumber[...]{
...}
}
一切仍然有效,但这最终破坏了我们的一个自动化 JUnit 测试,该测试将检查我们是否正确解决了练习:
@Test
void testAllFieldsPrivate() {
Field[] fields = RationalNumber.class.getDeclaredFields();
for (Field field: fields) {
assertTrue(Modifier.isPrivate(field.getModifiers()) || "Companion".equals(field.getName()),
"The RationalNumber class should have only private instance variables.");
}
}
当我搜索非私有字段时,这给了我很长一段时间的问题。最后我把测试弄乱了一点,发现它有问题的字段叫做“解析器”,这是我的伴随对象的名称。
当我问我的教授为什么会这样时,他无法给我答案,所以我想我应该在这里问。有谁知道为什么将命名的伴随对象作为非私有字段进行测试?
当我现在看时,测试似乎为名为“Companion”的伴随对象破例,我认为它是未命名伴随对象的默认名称。有人知道为什么这会作为非私人领域进行测试吗?
很简单,因为任何未声明为私有的字段都不是私有的。伴生对象也不例外。你需要做
private companion object{
}
为此
伴随对象根本不是私有的,除非被标记为私有。
因此,测试实际上明确排除了伴生对象,但他们以一种非常脆弱的方式进行。不要使用默认的“Companion”名称,测试还应该使用反射来获取伴随对象的实际名称。
问题是测试很可能正在使用 Java 反射,并且无法访问