2011-08-05 12 views
0

如何强制我的测试类覆盖特定界面?强制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。当然这不会起作用,因为测试需要将值放入。但使用实现可以让IDE添加方法,并强制执行完整接口。为了清楚起见,我知道我并不想在测试中实际实现接口,但我认为如果我能做到这样的话,它可以加速开发。

回答

3

对我来说,这取决于你的意思是“执行”和“覆盖特定的接口”。

如果您的接口方法暗示某些“契约”(例如,如果接收集合因调用而被修改,则java.util.Collection.add()返回true),您希望确保实现的界面,你可以创建一个Contract Test

如果你想看到测试受试者中的所有方法是通过一个特定的测试类锻炼,你可以像EMMACobertura运行下代码覆盖工具的测试,并确保结果是根据自己的喜好。

+0

它更多的后来我在想,所以我要找的是不是在JUnit的范围是什么? – Quaternion

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() }, 
    }; 
}