5

我有这种情况 - 我有接口(比如说MyInterface)和简单的部分实现(AbstractMyInterface)。后者添加了一些我想测试的受保护方法。

目前我只是手工编写一个模拟对象,它将AbstractMyInterface受保护的方法扩展和导出为公共的。有没有更简单的方法 - 例如使用 JMock+脚本?

4

3 回答 3

8

我看不出用 JUnit 测试受保护的方法有任何问题。只要测试的包结构反映源树结构,私有以外的方法对测试都是可见的。

当然,如果要测试的实现是抽象的,您必须自己创建被测类的普通子类(或者如果更适合您的目的,则通过一些模拟库来完成)。同样在这种情况下,无需为调用受保护的可见性方法而创建公共方法层。仅对于私有方法,此策略不起作用。但是经常需要测试私有方法无论如何都是设计问题的标志。

例如:要测试的类位于 src/mypackage/AbstractClass.java 包 mypackage;

/** This could as well implement some interface, 
    but that does not change a thing */
public abstract class AbstractClass {
    protected int returnsOne() {
        return 1;
    }
}

和位于 tests/mypackage/AbstractClassTest.java 的测试

package mypackage;

import org.junit.Test;

import static junit.framework.Assert.assertEquals;

public class AbstractClassTest {
    @Test
    public void returnsOneReturnsOne() {
        AbstractClass instanceToTest = new AbstractClassTestable();
        assertEquals(1, instanceToTest.returnsOne());
    }
}

/** This is needed, because we cannot construct abstract class directly */
class AbstractClassTestable extends AbstractClass {
}
于 2011-12-04T17:40:37.273 回答
3

只是一个建议,

如果我们不测试受保护的方法,我们可以使用公共方法来覆盖那些受保护的方法吗?

如果不是,是不是因为受保护的方法太复杂,重构把复杂的东西提取到一个新的对象中,它提供了公共接口,在一些公共方法中留下旧的对象只是一个私有对象。

稍后将在新对象上进行测试。

这篇博文可能会有所帮助。

于 2011-12-05T15:30:09.087 回答
0

您可以为接口(或抽象类)制作一个抽象测试用例。然后制作一个具体的测试用例,为接口(或抽象类)的每个具体实现扩展您的抽象测试用例。

于 2011-12-04T20:33:32.093 回答