强制jUnit测试涵盖整个界面

时间:2011-08-05 19:43:14

标签: java junit

如何强制我的测试类涵盖特定的界面?

还有一个编写重载测试方法的约定,所以名称是一致的(我当前的技术是这样的:methodName + parameter1Type + parameter2Type + ...)?

我希望如果有一个好方法可以解决/避免第二个问题。


我的问题是我有一些实现了许多接口的类。由于我正在测试Spring注入的服务类,所以一切都至少有一个接口。

无论如何说我有一个实现的课程:

public interface MyInterface{
    int doFoo(int input);
    int doBar(int input);
}

让我们说MyInterfaceImpl,实现这个接口。

现在我的测试类看起来像:

import static org.junit.Assert.assertEquals;
import org.junit.Test;
public class MyInterfaceImplTest{
    private MyInterface = new MyInterfaceImpl(); //could inject it...

    @Test
    public void doFooTest(){
       //content of test not relevant
    }

    @Test
    public void doBarTest(){
       //content of test not relevant
    }
}

现在上面的规模并不差,但很难知道我是否已经覆盖了大型课程中的所有测试,我可能错过了一个。另外我觉得为重载方法创建方法名称很有用。我还可以为一个类添加功能,但可能会错过它。如果我正在做TDD这几乎是不可能的,但我仍然想确定。我一直想写的是......

public class MyInterfaceImplTest implements MyInterface{

然后我想在每种方法前面坚持使用@Test。当然这不会起作用,因为测试需要将值放入。但是使用 implements 可以让IDE添加方法,并强制实现完整的接口。要清楚,我知道我不打算在测试中实际实现接口,但我认为如果我可以做这样的事情,它可以加快开发。

2 个答案:

答案 0 :(得分:3)

对我而言,这取决于“强制执行”和“涵盖特定界面”的含义。

如果您的接口方法暗示某些“合同”(例如,如果接收集合作为调用的结果被修改,则java.util.Collection.add()返回true),您希望确保的那些被实现者维护界面,您可以创建Contract Test

如果您想要查看测试主题的所有方法都由特定测试类执行,您可以使用代码覆盖率工具(如EMMACobertura)运行测试,并确保结果为你喜欢的。

答案 1 :(得分:0)

您应该考虑参数化测试。以下是TestNG

的样子
@Test(dataProvider = "dp")
public testInterface(StrategyInterface si) {
  // will be invoked twice, one with each implementation
}

@DataProvider
static public Object[][] dp() {
  return new Object[][] {
    new Object[] { new Strategy1Impl() },
    new Object[] { new Strategy2Impl() },
  };
}