gpt4 book ai didi

java - 如果我已经有 stub ,模拟库是否多余?

转载 作者:行者123 更新时间:2023-11-30 08:50:07 25 4
gpt4 key购买 nike

假设我在各自的源文件夹/包中有以下类...

[src/myApp]
|_Employee «concrete»
|_Manager «abstract»
|_ManagerImpl «concrete» (Class Under Test)
|_Recruiter «abstract»
|_RecruiterImpl «concrete» (Collaborator)

...

public class ManagerImpl implements Manager {
...
private Recruiter recR;
...

public void growTeam( Object criteria ){
//...check preconditions
Employee newB = recR.srcEmployee( criteria );
//...whatever else
}

...

}

...

[test/myApp]
|_RecruiterStandIn «concrete»
|_ManagerImplTest

...

public class RecruiterStandIn implements Recruiter { 

Map<Object, Employee> reSrcPool = new HashMap<>();

public RecruiterStandIn( ){
// populate reSrcPool with dummy test data...
}

public Employee srcEmployee( Object criteria ){
return reSrcPool.get( criteria );
}
}

...

public class ManagerImplTest {
...
// Class Under Test
private ManagerImpl mgr;

// Collaborator
private Recruiter recR = new RecruiterStandIn( );
...

public void testGrowTeam( ) {
//...
mgr.setRecruiter( recR );
mgr.growTeam( criteria );
// assertions follow...
}

...
}

...

这是我的问题:假设我有一个 RecruiterStandIn 具体实现,它已经存在于代码库中用于测试目的(test 范围内)...

  1. 在上述单元测试中也使用 mock 是否多余?

  2. 另外 在以上单元测试?

...

...
@Mock
private Recruiter recR;
...

...
public void testGrowTeam( ) {
...
expect( recR.srcEmployee( blah) ).andReturn( blah )...
// exercising/assertions/validations as usual...
}
...

您可以放心地假设 RecruiterStandIn 完成了被测类为了上述单元测试的目的而需要的一切。也就是说,为了简单的答案/解释,没有必要通过人为的假设围绕 stub 的维护和诸如此类的东西使上述场景过于复杂。

提前致谢。

最佳答案

我对您具体问题的回答:

  1. 在上述单元测试中也使用 mock 是否多余?

由于单元测试是现在编写的,所以它是多余的,但我在下面看到了对你的第二个问题的回答。

  1. 在上述单元测试中另外做这样的事情会有什么值(value)(如果有的话)?

它认为这是您应该进行测试的方式,我建议摆脱您的 stub ,RecruiterStandIn。相反,我会将新兵设置为返回预设答案,这样您就不必为了返回一些预定义数据而维护两个类:

@Spy
private Recruiter recR;

public void testGrowTeam( ) {

// Setup canned data return
doReturn(generateTestEmployee()).when(recR).srcEmployee(any(Object.class));

expect( recR.srcEmployee( blah) ).andReturn( blah )...
// exercising/assertions/validations as usual...
}

仅供引用,上面的语法将用于使用 Mockito。据我所知,在您的案例中,Mockito 使您能够删除某些部分以及更多内容,而无需您创建新的测试实体。

原始答案

当然可以,您应该进行模拟对象测试。 Mocks Aren't Stubs .模拟对象测试允许您测试类之间的交互,并确保事物与周围的世界正确交互。我认为当您第一次编写类及其相应的测试时,这些测试的值(value)较小。当一个新开发人员进来时,模拟对象测试在一年后大放异彩,并且由于她不了解需要某些内部行为而无意中破坏了代码..

一个有点做作的例子是,假设我们有一辆需要加满油的汽车:

public class Car {
public void fuelUp()
}

现在通过标准单元测试,我们将在调用 fuelUp() 后检查汽车是否加满油,以及是否从司机身上扣除了适当数量的钱。但由于我们从未测试过 fuelUp() 是如何与周围的世界互动的,它很容易做以下事情:

public void fueldUp() {
siphonGasFromNearestCar();
buyCoffeeAndChips()
}

但是通过模拟对象测试,您可以确保 Car 以正确和预期的方式装满。

关于java - 如果我已经有 stub ,模拟库是否多余?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31148456/

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