gpt4 book ai didi

java - 测试界面是否应该始终与功能界面相同?

转载 作者:行者123 更新时间:2023-11-28 20:52:26 26 4
gpt4 key购买 nike

TDD 新手在这里。我知道我们“测试的是接口(interface)而不是实现”,但可能会有一个 X 类的“测试接口(interface)”的情况,使用 Subclass Mock 和 protected 方法,这可能是类 X 的公共(public)方法定义的功能接口(interface)?

假设我有这样一个类:

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);

并在其中创建一个方法来测试“非公共(public)接口(interface)”(也称为“测试接口(interface)”):

@Test
public void whenIndexIsMadeAnIndexWriterConfigShouldBeCreated() throws Exception {
injectedSpySM_IndexMgr.makeIndexForFile();
verify( injectedSpySM_IndexMgr ).createIndexWriterConfig( mock(Analyzer.class) );
}

作为响应,为了将红色变为绿色,我通过如下修改我的应用类来响应:

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 组成

同时测试 functionBfunctionC 是浪费时间,因为您只能测试最终结果,即 functionA.. .只要functionA通过测试就没有必要测试其他的。

我例子中的functionA类似于测试接口(interface)。

或者用外行的话来说:这就像只要水从“管道末端”流出的精确度达到您的预期,那么您就没有必要每 2 英尺测试一次水流。

虽然还是由你来做决定

编辑

为避免为 functionBfunctionC 编写测试,最好先编写 test_functionA,一旦它为绿色,您就可以从那里开始。可能永远不需要您的 test_functionBtest_functionC。编写 testfunctionCtestfuncionB 会使它变得更加困难,并且您需要编写所有三个测试。

关于java - 测试界面是否应该始终与功能界面相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40574301/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com