TDD newb在这里。我知道我们"测试接口而不是实现",但是是否有一个使用子类Mock和受保护方法的类X的"测试接口"的情况,这可能是由类X的公共方法定义的功能接口的超集?
假设我有这样一个类:
class IndexManager {
IndexManager( File file ){
...
}
public void someFunctionalMethodUsedByOtherClasses(){
...
}
}
在我的测试课上,我是这样做的:
@RunWith(MockitoJUnitRunner.class)
public class IndexManagerTest {
...
class SubclassMockIndexManager extends IndexManager {
SubclassMockIndexManager( File file ){
super( file );
}
@Override
protected IndexWriterConfig createIndexWriterConfig( Analyzer analyser ){
return super.createIndexWriterConfig( analyser );
}
}
@Spy
@InjectMocks
SubclassMockIndexManager injectedSpySM_IndexMgr = new SubclassMockIndexManager(tempFile);
并在其中创建一个方法来测试"非公共接口"(又名"测试接口"):
@Test
public void whenIndexIsMadeAnIndexWriterConfigShouldBeCreated() throws Exception {
injectedSpySM_IndexMgr.makeIndexForFile();
verify( injectedSpySM_IndexMgr ).createIndexWriterConfig( mock(Analyzer.class) );
}
作为响应,要将红色变为绿色,我通过修改我的app类来响应,如下所示:
class IndexManager {
IndexManager( File file ){
...
}
// added as part of normal red-green TDD development cycle
protected IndexWriterConfig createIndexWriterConfig( Analyzer analyser ){
... // make IndexWriterConfig object
return indexWriterConfig;
}
public void someFunctionalMethodUsedByOtherClasses(){
...
}
}
我只是很困惑为什么TDD开发周期必须局限于暴露给所有其他类的测试方法…
假设你有一个functionA
,它由functionB
和functionC
组成
同时测试functionB
&functionC
,当你只能测试最终结果,即functionA
…只要functionA
通过了测试,那么就没有必要测试其他的。
我的示例中的functionA
与测试接口的CC_8类似。
或者用外行人的话来说:这就像只要水从"管道末端"流出,正好符合你的期望,那么你就没有必要每隔2英尺测试一次水的流量。
尽管做决定的还是你
编辑
避免为functionB
&最好先写test_functionA
,一旦它是绿色的,你从那里开始。可能是你的test_functionB
&永远不需要test_functionC
。写作testfunctionC
&testfuncionB
将使它变得更加困难,并且将使您需要编写所有三个测试。