2014-10-28 95 views
1

我观察到一个断言失败,我试图在下面进行描述。简而言之,当我调用重写的方法时,初始化的类成员虚假地变为空成员变量为空,虚假?

abstract class A<T> { 
    T target 

    def something() { 
     assert target != null  // sanity check -- fails when invoked below 
     return this 
    } 
} 

class B extends A<Something> { 
    static B makeB() { 
     def b = new B() 
     b.target = new Something(); 
     assert b.target != null 
     return b 
    } 
} 

// package test 
// Test code 
// 
def b = B.makeB()  // <-- success. 
assert b != null 
assert b.target != null 
b.something()   // <-- fails assertion 
print "Success!" 

我有产生最小的测试用例的麻烦 - 在成功compileonline.com 但与我们在我们的机器代码(到位东西与龙)运行在上面。

的问题消失,如果我重新实现在子类B.

有没有人观察到了类似的效果something方法?我已经非常沮丧了。

+0

“Something”类在哪里?你能补充吗? – 2014-10-28 09:32:12

+0

它恰好是一个Grails域对象 - 这是我不了解最小失败测试用例的地方。也许相关:A用Something和SomethingElse扩展(extends Something)。 – 2014-10-28 09:36:21

+0

事实上,我在代码中用'Long'替换了'Something',并且发生了同样的故障。还没有找到一个独立失败的测试用例。 – 2014-10-28 09:50:50

回答

0

问题实测值:一个混合使用相同的部件名称

通过代码步进和仔细检查本地栈变量,我们发现,在具有Grails Integration Test Mixin可变target这是在接收到分配消息的实例。假设任何与mixin的实例变量共享一个名字的实例变量都应该遵循上面描述的行为,但是我们不知道整个条件集合

最合理的解决方案是时间方面的@cfrick)将我们的变量target重命名为其他内容。

后续问题

  1. 这是预期的行为?最好的解决方案在一个坏的海洋?
  2. 此行为是否因新的Groovy编译器或Grails堆栈而改变?
  3. (仍然相关)什么是最小测试用例?