我的编程课程中有一个项目,但我没有通过测试用例。我查看测试驱动程序并找到它:
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
我没有通过这些测试用例,只是想知道原因。感谢
答案 0 :(得分:3)
如果您询问&=
赋值运算符,只有当右侧参数也为真时才会使变量保持为真(如果它已经为假,则它将保持为假)。它就像+=
一样,a &= b
与a = 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);
这也会产生有用的输出,以帮助确定失败的确切内容(例如错误计数的值)。
答案 1 :(得分:1)
它似乎在检查您在班级中声明了多少个字段,以及其中有多少是隐私可见性。
答案 2 :(得分:1)
如果您对&=
感到疑惑,请点击JLS 15.22.2. Boolean Logical Operators &, ^, and |引用。
对于&amp ;,如果两个操作数值都为真,则结果值为true;否则,结果是错误的。
布尔值的运算符&
和|
是&&
(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):
返回
Field
个对象的数组,这些对象反映由此Class
对象表示的类或接口声明的所有字段。这包括公共,受保护,默认(包)访问和私有字段,但不包括继承字段。
如果您还要计算继承的字段,则计数可能不正确。
答案 3 :(得分:0)
在Java中,变量和方法的名称空间不会发生冲突。所以看起来驱动程序既有变量又有一个名为“test”的方法。
如果没有test()方法和您自己的源代码,很难说出了什么问题,但看起来您的Square类中的字段数量是错误的。 (应该有五个。)
答案 4 :(得分:0)
是的,似乎需要更多的字段来完成声明,这应该修复命名空间。