如何强制我的测试类涵盖特定的界面?
还有一个编写重载测试方法的约定,所以名称是一致的(我当前的技术是这样的: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添加方法,并强制实现完整的接口。要清楚,我知道我不打算在测试中实际实现接口,但我认为如果我可以做这样的事情,它可以加快开发。
答案 0 :(得分:3)
对我而言,这取决于“强制执行”和“涵盖特定界面”的含义。
如果您的接口方法暗示某些“合同”(例如,如果接收集合作为调用的结果被修改,则java.util.Collection.add()返回true),您希望确保的那些被实现者维护界面,您可以创建Contract Test。
如果您想要查看测试主题的所有方法都由特定测试类执行,您可以使用代码覆盖率工具(如EMMA或Cobertura)运行测试,并确保结果为你喜欢的。
答案 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() },
};
}