[英]Do I need to test each implementation of an interface to test the interface?
通常,我的應用程序中只有一個接口實現,並且在為接口編寫測試時總是使用第一個實現。 假設我有一個Destroyer
接口和一個DestroyerImpl
實現。 然后我會在測試中使用該類:
class DestroyerTest
{
private Destroyer destroyer = new DestroyerImpl();
@Test
public void test() { ... }
}
然后通過在接口測試中實例化來隱式測試該類。 如果我寫另一個實現類EpicDestroyer
我現在覺得我必須測試它。
那么,我是否編寫了兩個測試類DestroyerImplTest
和EpicDestroyerTest
,它們都使用不同的實現來測試相同的Destroyer
接口? 這不是多余的嗎? 我可以通過參數化來測試同一測試套件中的每個實現 。 這是這樣做的嗎?
我認為你對測試的想法存在誤解。
測試界面沒有任何意義,因為它只是一個規范。 只能測試實現。 所以你應該測試所有的實現。 但是,您可以從界面派生測試用例,因為所有實現都需要遵守其中的規范。 因此即使您有完全不同的實現,您也可以在這些實現之間共享測試。
在我看來應該有如下的測試類:
import java.util.List;
import org.junit.Assert;
import org.junit.Test;
public abstract class AbstractModifiableListTest
{
protected abstract <T> List<T> createListInstanceUnderTest(T... elements);
@Test
public void removeDecreasesSizeByOne() {
List<String> list = this.<String>createListInstanceUnderTest("a","b","c");
int originalSize = list.size();
list.remove( 0 );
int newSize = list.size();
Assert.assertEquals( originalSize - 1, newSize );
}
}
包含測試接口規范的測試用例 - 在本例java.util.List
。 然后,通過實現抽象方法並可能添加依賴於實現的測試用例,測試實現然后參數化測試用例。
我從不“測試”一個界面,因為沒有什么可以測試的。 界面描述了每個實現交付的服務,它的合同。
因此,您必須測試此服務的每個實現,以確保每個人都能正確完成工作。
我不會說接口可以測試 ,因為它們提供抽象而不是實現 。 另一方面,測試需要確保是否實現了特定行為(並且行為在類中)。
那么,我是否編寫了兩個測試類DestroyerImplTest和EpicDestroyerTest,它們都使用不同的實現來測試相同的Destroyer接口?
我會說, 是的 。
如果您正在測試接口,那么使用單個實現測試它應該足夠了,因為接口不依賴於特定的實現。
當然,您可能希望測試每個實現,但是為了測試實現類,而不是接口本身。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.