测试接口应该始终与功能接口相同吗?



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,它由functionBfunctionC组成

同时测试functionB &functionC,当你只能测试最终结果,即functionA…只要functionA通过了测试,那么就没有必要测试其他的。

我的示例中的functionA与测试接口的CC_8类似。

或者用外行人的话来说:这就像只要水从"管道末端"流出,正好符合你的期望,那么你就没有必要每隔2英尺测试一次水的流量。

尽管做决定的还是你

编辑

避免为functionB &最好先写test_functionA,一旦它是绿色的,你从那里开始。可能是你的test_functionB &永远不需要test_functionC。写作testfunctionC &testfuncionB将使它变得更加困难,并且将使您需要编写所有三个测试。

相关内容

  • 没有找到相关文章

最新更新