这段 Java 代码是如何执行的?

4

我在我的编程课上有一个项目,但是有一个测试用例无法通过。我查看了测试驱动程序,发现以下内容:

 private static boolean testSquareArch()
  {
  boolean pass = true;
  int test = 1;
  int cnt;
  Square sq;
  Class cl;

  System.out.println("Square architecture tests...");

  sq = new Square(true, true, true, true, 0, 0);

  cl = sq.getClass();
  cnt = cl.getFields().length;
  pass &= test(cnt == 5, test++);  //FAILING THIS TEST

这个代码是干什么的?它是如何检查我的代码的?
还有,这个是干嘛用的?
  // Count and test number of of PACKAGE fields
  cnt = cl.getDeclaredFields().length
      - countModifiers(cl.getDeclaredFields(), Modifier.PRIVATE)
      - countModifiers(cl.getDeclaredFields(), Modifier.PROTECTED)
      - countModifiers(cl.getDeclaredFields(), Modifier.PUBLIC);
  pass &= test(cnt == 5, test++);  // Test 8 

我无法通过这些测试用例,想知道为什么。谢谢。


请问在上述引用行之前,传递变量的初始赋值和其他赋值是什么?另外,请包括测试方法的主体。 - James
更多的上下文会有帮助。例如,cnt、cl和pass是什么?向上滚动(或使用IDE)以找到它们被声明在哪里。这是哪个方法?等等。 - Tyler
2
除了测试代码生成器之外,哪种单元测试会计算类中的字段? - Thilo
我很高兴知道有一门编程课程包括任何类型的自动化测试用例。我认为我的母校没有人包括它们。 - Mike Daniels
1
@Thilo - 这些不是传统的单元测试。相反(或者除此之外),它们似乎在测试学生的代码是否按照某些“好的解决方案”标准实现。我可以理解这样做的一些理由。但是,学生不应该通过查看驱动程序代码来进行逆向工程分析标准! - Stephen C
5个回答

3

如果您询问的是&=赋值运算符,它只有在右侧参数也为true时才保持变量为true(如果它已经为false,则保持不变)。它的工作方式就像+=一样,a&=ba=a&b相同,运算符&是布尔连接(AND)。

 pass &= test(cnt == 5, test++); 

是…的简写方式

 if( ! test( cnt == 5, test ) )
     pass = false;
 test++;

我假设这是单元测试代码的一部分,断言cnt == 5,同时计算测试数量和总结果(通过或失败)。

使用Junit,您无需手动处理测试数量或最终结果,可以编写如下代码:

assertEquals("count is correct", 5, cnt);

这也将产生有用的输出,以帮助确定到底发生了什么错误(例如不正确计数的值)。

好的,但是我的代码(未显示)有什么问题会导致这个测试驱动程序失败呢? - dukevin
1
测试失败是因为cnt(类Square中的字段数)不等于五。 - Thilo
请看我的关于 getDeclaredFields() 的回答。 - polygenelubricants

1

它似乎正在检查您在类中声明了多少个字段,以及其中有多少是私有可见性。


1

如果你对 &= 感到困惑,这里有一句引用来自 JLS 15.22.2. Boolean Logical Operators &, ^, and |

对于 &,如果两个操作数的值都为 true,则结果值为 true;否则,结果为 false。

布尔类型的运算符 &|&& (15.23) 和 || (15.24) 的不太知名的表亲。后两者是“条件”运算符;它们会短路并且只在实际需要时才评估右侧。

&& 运算符类似于 & (§15.22.2),但仅在其左操作数的值为 true 时才计算其右操作数的值。

&=& 的复合赋值版本。请参见 JLS 15.26.2. Compound Assignment Operators

形式为 E1 op= E2 的复合赋值表达式等效于 E1 = (T)((E1) op (E2)),其中 T 是 E1 的类型,但 E1 只计算一次。

换句话说,以下表达式是等价的(假设 boolean b):

b &= bool_expr;
b = b & bool_expr;
if (!bool_expr) b = false;

这可能也是你的问题(java.lang.Class#getDeclaredFields):

返回一个反映由此 Class 对象表示的类或接口声明的所有字段的 Field 对象数组。这包括公共、受保护、默认(包)访问和私有字段,但不包括继承的字段。

如果您还想计算继承的字段,则您的计数可能不正确。

0
在Java中,变量和方法的命名空间不会冲突。因此,看起来驱动程序既有一个名为“test”的变量,又有一个名为“test”的方法。
如果没有test()方法和您自己的源代码,很难说出问题在哪里,但看起来您的Square类中字段的数量不正确。(应该有五个。)

0

是的,看起来需要更多的字段来满足语句,这应该可以修复命名空间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接