如何使用JUnit和JMock测试抽象类的受保护方法

Mac*_*tka 5 java junit unit-testing jmock

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

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

Mik*_*unu 8

使用JUnit测试受保护的方法时,我看不出任何问题.只要测试的包结构镜像源树结构,除了private之外的方法对于测试是可见的.

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

例如:要测试的类到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;
    }
}
Run Code Online (Sandbox Code Playgroud)

并测试哪个位于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 {
}
Run Code Online (Sandbox Code Playgroud)