我该如何测试匿名类?

时间:2015-08-25 13:24:29

标签: java junit anonymous

使用匿名类的遗留代码很少,并且它最终成为单个文件中的大多数代码。我想知道是否还有测试匿名课程?

例如:

if (wp.speed != null && wp.speed >= 0) {

            FlightProtocol fp = new FlightProtocol() { //starts here

                @Override
                public Query getQuery() {
                    Query q = Query.empty();
                    if (wp.minSpeed < 0)
                        q = Query.and(q, Query.eq(Speed.Function, WayPoint));
                    else {
                        q = Query.and(q, Query.eq(Speed.Function, Field));
                        q = Query.and(q, Query.eq(Speed.Calc, wp.maxSpeed-wp.minSpeed));
                    }
                    q = Query.and(q, Query.eq(Speed.Id, wp.altitude/greatCircle));
                    return q;
                }
} else { ...}

这样或类似的东西甚至可以进行单元测试吗?

3 个答案:

答案 0 :(得分:3)

单元测试的目的是验证public API的行为。匿名类是一个实现细节,编写单元测试以验证它是如何工作的(直接)将使您的测试变得脆弱。而是编写测试来验证调用匿名类的代码。

如果您的匿名类的行为如此复杂,您想要单独测试它,它不应该是匿名的。将它解压缩到自己的类中(可能作为包私有静态内部类),然后您可以正常测试它。

答案 1 :(得分:2)

您无法直接测试匿名类。您应该重构您的匿名类,使其不是匿名的,或者只是测试包含类的公共API。

lambda表达式也是如此。如果您希望能够对功能进行单元测试,则无法内联定义该功能。

答案 2 :(得分:1)

为什么你要测试内部课程?

确保行为是预期测试的外部类或方法。

只需按原样使用该类,并测试外部类/方法的行为是否是预期的。 您不需要测试内部课程以确保其正确行为。

来自dimo414评论的精彩内容。

  

您不应该测试内部类。内部类完全有可能具有过于复杂的行为,此时应将其拉出到自己的代码块中并像其他任何代码一样进行测试