Java - 如何测试抽象类的非抽象方法?

时间:2018-04-13 12:25:55

标签: java testing junit abstract-class

我有一个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.url localhost: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));
    }
}

2 个答案:

答案 0 :(得分:7)

您将无法创建仅SomeAbstractClass的实例,不能 - 但您可以创建一个匿名子类:

private SomeAbstractClass sac = new SomeAbstractClass() {};

你可能只想为了测试而创建一个具体的子类 - 所以只要你添加抽象方法,你就需要把它们放在那里。

虽然我怀疑你可以使用一个模拟框架,但我怀疑它会增加更多的复杂性以获得一点好处,除非你需要检查在什么情况下调用抽象方法。 (模拟非常适合交互测试,但对于其他目的来说可能很脆弱。)它也可以轻松地产生更混乱的错误消息(由于涉及基础设施)。

答案 1 :(得分:0)

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

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

SomeAbstractClass sac = new SomeAbstractClass(){};

但是,我实际上会建议您通过MockitoEasyMock这样的模拟框架模拟该类。