【问题标题】:Java - How to test the non-abstract methods of an abstract class?Java - 如何测试抽象类的非抽象方法?
【发布时间】:2018-09-23 19:27:38
【问题描述】:

我有一个具有 no 抽象方法的 abstract 类...如何进行测试?我可以简单地将其导入测试类并照常工作吗?

例子:

public abstract class SomeAbstractClass implements SomeOtherClass {

    // Some variables defined here
    private static final String dbUrl = System.getProperty("db.url");

    // Some public methods
    public String doSomethingToUrl(String url) {
        url = url + "/takeMeSomewhereNice";
    }

}

假设我为db.urllocalhost:8080 传递了一个arg,我想测试doSomethingToUrl 方法是否输出了新字符串......它仍然是这种格式吗?

public class TestUrl {

    SomeAbstractClass sac = new SomeAbstractClass();

    @Test
    public void testUrlChange() throws Exception {

        String testUrl = "localhost:8080";

        assertThat("localhost:8080/takeMeSomewhereNice", 
            sac.doSomethingToUrl(testUrl));
    }
}

【问题讨论】:

  • 我不确定这是否是常见的做法,但是模拟/存根被测单元(又名抽象类)不会完成这项工作吗?当然,这仅适用于 iff。被测试的方法不调用任何抽象方法。
  • 您创建模拟/存根。这是该类的一个小型演示实现,只是为了进行测试。如果代码不是太大,您可以使用匿名类轻松实现这一点。
  • 不,对我来说不是重复的@Turing85。

标签: java testing junit abstract-class


【解决方案1】:

你不能只创建 SomeAbstractClass 的实例,不,但你可以创建一个匿名子类:

private SomeAbstractClass sac = new SomeAbstractClass() {};

您可能希望创建一个具体的子类只是为了进行测试 - 这样无论何时您添加抽象方法,您只需将它们放在那里。

虽然我怀疑您可以为此使用模拟框架,但我怀疑它会增加更多复杂性而没有什么好处,除非您需要检查在什么情况下调用抽象方法。 (Mocks 非常适合交互测试,但对于其他目的来说可能很脆弱。)它也很容易产生更令人困惑的错误消息(由于所涉及的基础架构)。

【讨论】:

  • 我想知道为什么 Eclipse 会生成花括号!感谢黛西的信息。我以前见过 Mockito 的使用,它可以用来解决问题,但这只是一个简单的案例。
  • SomeAbstractClass underTest = Mockito.mock(SomeAbstractClass.class, Mockito.CALLS_REAL_METHODS);。真的没那么复杂。您的解决方案仅适用于 iff。抽象类没有抽象方法。如果有,您将不得不为抽象方法创建“虚拟”实现,这比使用例如创建模拟要多得多。模拟。
  • @Turing85:它比完全不使用模拟更复杂 - 并且还需要对 Mockito 的依赖,否则可能不会使用。我已经在答案中的示例下讨论了一个虚拟实现。除非我实际上在进行交互测试,否则我通常发现它比模拟更容易使用。 (有时我会有几个假货,用于不同的目的。)我的经验是,使用模拟你经常会遇到非常令人困惑的错误,如果你真的使用模拟功能,这可能是值得的,但如果你'我只是在尝试测试其他方面。
【解决方案2】:

您无法初始化abstract 类,因此您的测试类不会按原样编译。

您可以使用匿名实例(下面的示例就足够了):

SomeAbstractClass sac = new SomeAbstractClass(){};

不过,我实际上建议您mock 使用诸如MockitoEasyMock 之类的模拟框架的类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 2016-12-05
    • 2016-05-10
    相关资源
    最近更新 更多