gpt4 book ai didi

java - 使用对象实例化测试代码的良好实践

转载 作者:行者123 更新时间:2023-12-02 13:32:23 26 4
gpt4 key购买 nike

是否有任何准则(或最佳做法)使以下内容井井有条?

我有以下测试方法:

fun findProfileByPersonalInfo(personInfo: PersonalInfo): Profile? {
localProfileRepository.findByPersonalInfo(personalInfo)?.let {
return it
}
val searchParams = RemoteProfileSearchParameters()
//... Some mapping from personalInfo to searchParams
remoteProfileRepository.findRemoteProfile(searchParams)?.let {
val profile = profileFactory.create(remoteProfile)
return save(profile)
}
return null
}

当我开始为此功能编写单元测试时,我意识到:
  • 测试行val profile = profileFactory.create(remoteProfile)既方便又方便,因为我可以模拟此调用的结果,并分别测试从remoteProfileprofile的映射。有了这个,如果我更改了映射逻辑,就不会破坏对findProfileByPersonalInfo的测试,这很好。
  • 反之亦然,如果从personalInfo映射到searchParams的逻辑属于findProfileByPersonalInfo,那么维护测试是不正确且困难的。

  • 问题是:
  • 是否可以(几乎)总是将实例化逻辑从被测函数中移出,使其更具可测试性和可维护性?毫无疑问,对此的异常(exception)是仅负责实例化对象的函数。
  • 为属于上述情况的每个对象创建某种类型的工厂不是太多吗?因此,系统的总体设计似乎受到了影响。

  • 非常感谢您引用最佳做法或讨论。非常感谢你!

    最佳答案

  • 有点宽,通常,您希望方法不要做太多,而是将可重用的代码部分移至单独的方法。基于您显示的有限上下文,在这种情况下,出于可测试性和可读性的考虑,我肯定会将该实例移出。
  • 您并不总是需要一个成熟的工厂,根据上下文的不同,简单的构造函数RemoteProfileSearchParameters(personInfo: PersonalInfo)在这里可能是最明智的。根据复杂性,可以将其重构为工厂方法或实际工厂对象,但是通常这并不是您的第一个目标。
  • 关于java - 使用对象实例化测试代码的良好实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60632651/

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