代码之家  ›  专栏  ›  技术社区  ›  Allain Lalonde

在单元测试中对Java访问进行反编译的替代方案

  •  2
  • Allain Lalonde  · 技术社区  · 15 年前

    我尝试用一些私有方法对类进行单元测试。每种私有方法都可以相当广泛。

    我可以将方法包设为范围(这会导致警告),也可以使用下面的代码来测试它:

    Method method = instance.getClass().getDeclaredMethod("methodName");
    method.setAccessible(true);
    Object object = method.invoke(instance);
    assertNotNull(object);
    

    这个类不是一个“上帝的对象”,它的大多数方法涉及到它的所有领域。

    关于如何更好地处理这个问题有什么建议吗?

    5 回复  |  直到 15 年前
        1
  •  11
  •   KLE rslite    15 年前

    测试私有方法也可能是一种测试气味。

    我的推荐书很好 http://www.manning.com/rainsberger/

    1. 你应该这样做 测试行为而不是方法 :粒度有点不同。

      示例1:要测试一堆,如何测试 push pop 没有相互参照?但测试全球行为是可能的。这提醒我们,即使对于测试,对象也是正确的粒度,而不是方法。

      示例2:当您想要测试多个对象之间的交互时,方法测试方法显然不正确,您想要测试全局行为。

    2. 如果一个方法不是公共的,它就不能被外部世界调用,而且它的行为也没有被严格定义。但最重要的是,如果您测试一个私有方法,以后将无法重构代码。所以 测试只能在公共代码上进行 .

        2
  •  1
  •   TrueWill    15 年前

    克莱是对的。

    但是,如果您正在处理遗留代码,并且必须处理私有方法中的依赖项,那么最后一种方法是 JMockit . 我没有用过,但在 The Art of Unit Testing . 它应该能够将原始类的调用转换为您的伪类。

    使用它来打破对其他对象的依赖,这样您就可以测试公共方法,而不是测试私有方法。在重构到一个分离的设计的过程中,把它作为一个安全网使用。

        3
  •  0
  •   Constantin    15 年前

    如果您还没有使用它,这可能是一个延伸…但是,对于违反单元测试的访问限制,groovy确实是非常棒的…您可以像公开方法一样访问和调用这些方法,而不需要进行额外的反射。

        4
  •  0
  •   Yishai    15 年前

    我很好奇在打包作用域方法时会收到什么样的警告,但是无论如何,解决这种问题的方法是使测试成为对象的静态内部类。这可能需要权衡;如果部署大小是一个重要问题,则可能需要将类排除在与代码一起打包的情况下,并且需要小心避免意外地将依赖项从测试框架引入到生产代码中。

    另一个可能的选项是拥有一个静态的内部类,它帮助公开您需要的方法,测试将使用它作为对私有方法的传递。这里的缺点是,这个类本质上向任何想要使用该类的人公开私有方法,因此您必须小心地清楚地表示,这个类仅用于测试目的。

        5
  •  0
  •   sleske    15 年前

    你可以考虑使用 reflection .