成员变量变为空,虚假?

时间:2014-10-28 09:27:53

标签: grails groovy

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

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!"

我在制作最小测试用例时遇到问题 - 以上(使用Long代替 Something )在compileonline.com 上成功运行,但在我们的代码中没有运行机

如果我在子类B中重新实现something方法,问题就会消失。

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

1 个答案:

答案 0 :(得分:0)

发现问题:Mixin使用相同的成员名称

仔细检查代码并仔细检查本地堆栈变量,我们发现 Grails Integration Test Mixin有一个实例变量target正在接收分配消息。据推测,任何实例使用mixin实例变量共享名称的变量应该遵循我上面描述的行为,但我们不知道完整的条件集

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

后续问题

  1. 这是预期的行为吗?在糟糕的海洋中最好的解决方案?
  2. 是否使用新的Groovy编译器或Grails堆栈更改了此行为?
  3. (仍然相关)什么是最小测试用例?