【问题标题】:Testing all classes which implement an interface in Java测试所有在 Java 中实现接口的类
【发布时间】:2008-09-20 19:24:09
【问题描述】:

有什么东西可以让您自动测试接口的行为(特别是针对 Java)吗?例如,假设我对 Comparable 接口进行了一堆测试,这些测试应该适用于实现 Comparable 的任何东西。我想要的是能够在我的任何实现 Comparable 的类的测试装置中自动包含“ComparableTests”。如果这适用于通用接口,则可以加分。

我知道 .NET 框架 mbUnit 有类似的东西,当您使用类似 TestNG 的生成器函数时,您可以为 Comparable 设置一个测试夹具,并让生成器为您实现的每个类创建一个实例可比。但我更希望它是自动的,并且位于我的每个类的测试夹具中(因为我已经有了它们来测试该类的其他部分)。

澄清:我绝对可以构建这样的东西。我在问是否有任何东西已经启用了这个。

【问题讨论】:

    标签: java unit-testing interface


    【解决方案1】:

    根据您的最后一段,您尝试做的是在单元测试中注入一些“额外方法”,因为您已经在测试特定的类。我不知道有什么测试工具可以让您根据类的层次结构附加测试。

    但是,您自己建议使用 TestNG 构建类似的东西,我认为您可能非常接近。您可以很好地合并一些基本代码,将您的类添加到“默认测试类”列表中,如果它们实现特定接口,则依次测试它们。

    不过,对于一般情况,我认为您不走运,因为 Java 类型系统是单向的,您只能(轻松)找出类实现的接口,而不是相反。此外,问题是“在哪里停止查找”:如果您有一个检查所有comparable 实现者的测试,您是否希望它也检查String 的有效性,因为那是在您的Java 环境中?

    【讨论】:

      【解决方案2】:

      【讨论】:

      • 我知道如何查找课程,但我不确定这如何回答问题。
      【解决方案3】:

      在 .NET 中,设置一个查看程序集并识别每个类的继承/实现层次结构的方法非常简单。如果你研究Java reflection API,我相信你也可以用 Java 来做。

      然后您可以创建一个ITargetInterfaces 数组并在每个数组上调用一个测试方法。

      【讨论】:

        【解决方案4】:

        一种方法是在 jar 文件中搜索所有 .class 文件(或搜索 classes 目录),使用 Class.forName() 方法加载类文件并检查 MyInterface.class.isAssignableFrom(myClass )。

        这不会轻易处理公共内部静态类(您可以解析类文件名),但永远不会与私有内部类或匿名内部类一起使用。

        【讨论】:

        • 这可能会非常困难,因为可能会使用复杂的工厂来实例化接口的特定实现。
        猜你喜欢
        • 1970-01-01
        • 2010-09-07
        • 2020-12-19
        • 2015-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-05
        相关资源
        最近更新 更多