为了账号安全,请及时绑定邮箱和手机立即绑定

在同一个类中模拟另一个公共方法是一个好习惯吗

在同一个类中模拟另一个公共方法是一个好习惯吗

ITMISS 2021-11-11 14:15:38
例如:public class NumberService {public boolean isNaturalNumber(int num) {    return num > 0;}public String getClassificationInfo(int num) {    return isNaturalNumber(num) ? num + "is a natural number" : num + "is not a natural number";}}这里有两个公共方法,以及getClassificationInfo称为方法的方法isNaturalNumber。isNaturalNumber测试时模拟是一个好习惯getClassificationInfo吗?像这样:    @RunWith(MockitoJUnitRunner.class)public class NumberServiceTest {@Spyprivate NumberService numberService;@Testpublic void test_getClassificationInfo_when_is_natural_number() {    int num = generateInt();    doReturn(true).when(numberService).isNaturalNumber(num);    String classificationInfo = numberService.getClassificationInfo(num);    assertThat(classificationInfo).isEqualTo(num + "is a natural number");}@Testpublic void test_getClassificationInfo_when_is_not_natural_number() {    int num = generateInt();    doReturn(false).when(numberService).isNaturalNumber(num);    String classificationInfo = numberService.getClassificationInfo(num);    assertThat(classificationInfo).isEqualTo(num + "is not a natural number");}// the other test for isNaturalNumberprivate int generateInt() {    return new Random().nextInt();}}
查看完整描述

2 回答

?
冉冉说

TA贡献1877条经验 获得超1个赞

在这种特殊情况下,模拟调用的方法是没有意义的。然而,这不仅仅是因为它是同一个类的方法。实际上,有时会专门引入同一类的方法以允许模拟它们。例如,如果在您的类中处理通过文件 I/O 获得的某些数据,您可以将文件 I/O 隔离到它自己的方法中。然后,您可以使用文件 I/O 方法的模拟版本测试数据处理。

但是,在这种情况下,没有充分的理由isNaturalNumber在测试中模拟getClassificationInfo: 该方法isNaturalNumber具有确定性的行为,并且不会导致不可接受的长执行时间。这似乎也不太可能通过模拟的情况下获得太多isNaturalNumber在一个测试中错误地故意行为getClassificationInfo

你不必教条地嘲笑一切。例如,您也不要模拟标准库数学函数,如sincos,因为它们在大多数情况下也不会引起问题。模拟应该是有原因的。因此,如果您考虑模拟一个函数或方法,您应该知道您将要解决哪个问题。如果没有问题要解决,不要嘲笑。


查看完整回答
反对 回复 2021-11-11
?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

不,这不是一个好习惯,因为我们应该在涉及其他模块/类对象的地方模拟存根。


例如:


public class A{

   private B aObj;


   public void aDoingSomeBWork(){

      aObj.someMethod();

      someLogic();

  }

   private/public/any modifier void someLogic(){

     //some logic

   }

}


public class B{

   public void someMethod(){}

}

那么你应该模拟 B 的 someMethod() 但不应该模拟 A 的 someLogic() 因为你正在单元测试 A 的 aDoingSomeBWork() 方法。如果你模拟 someLogic(); 在单元测试中,可能会出现您的代码中断的情况。


查看完整回答
反对 回复 2021-11-11
  • 2 回答
  • 0 关注
  • 161 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信