当前位置: 首页 > 知识库问答 >
问题:

监视一个方法是调用实际的方法,而不是模拟的方法

卫嘉言
2023-03-14

我有一个服务类叫“主机服务”

 @Service
 class HostService {
       @Autowired
       private val platformService: PlatformService = null

       def views: Option[HostView] = {
             val ip = "10.x.x.x"
             if (!this.isReachable(ip))
                throw new IPNotFoundException
             else{
                var versionInfo: Option[String] = null
                versionInfo = platformService.contextPathOf("version") match  {
                   case versionInfo if (versionInfo == Some(null)) => Option("")
                   case versionInfo => versionInfo
                }
             }
       }

       def isReachable(ip:String) :Boolean = {
           // makes a URl connection and checks if IP is reachable
       }

现在我想使用Mockito编写一个单元测试用例'HostServiceTest'。我将创建一个主机服务和模拟平台服务的实例,并监视这个主机服务实例来模拟isReachable方法。

    class HostServiceTest extends FlatSpec with Mockables with OptionValues with BeforeAndAfter {
         var platformService: PlatformService = _
         before {
             platformService = mock[PlatformService]                

when(platformService.contextPathOf((anyString()))).thenReturn(Option("1.0.0-SNAPSHOT"))
          }

        it should "return response with out error " in {
           val hostService: HostService = new HostService
           mockField(hostService, "platformService", platformService)
           val hostServiceSpy = spy(hostService)
           doReturn(true).when(hostServiceSpy ).isReachable(anyString())
           val data = hostService.views
           // Some validation Checks
        }

在测试用例中,它不是调用isReachable的模拟方法,而是进入实际的方法。

我看到了这个问题:试图窥探方法是调用原始方法,我确实遵循了他们建议的方法,但它调用的是实际的方法。o

这可能有什么问题?

共有1个答案

曾光誉
2023-03-14

当嘲弄字段时,确保它是'var'如果它是val,则嘲弄者不能将字段设置为新值。

您的HostService将platformService声明为val(表示final)

class HostService {
   @Autowired
   private val platformService: PlatformService = null

一旦创建hostService,它就会有一个最终字段PlatformService。

val hostService: HostService = new HostService

当您尝试模拟platformService字段时,它将模拟API将尝试重置platformService。

mockField(hostService, "platformService", platformService)

修复:尝试将platformService更改为var

private var platformService: PlatformService = null
 类似资料:
  • 我有一个类,它有一个私有方法,并在其主体中调用另一个私有方法。所以我想调用第一个私有方法并模拟第二个。以下是一个例子: 和测试等级: 我通过

  • 但是不知何故,method3()并没有被嘲笑,我仍然看到它打印的内容。但是,我可以成功地模拟method2()。也许是因为method2()是从method1()直接调用的,我正在测试的方法是什么?请建议我如何模拟方法3。 谢谢,梅赫

  • 实际的方法是在第3行被调用()。我已经添加了和注释。 为什么调用实际方法?我也尝试了PowerMockito.do返回,但是得到了同样的问题。

  • 问题内容: 让我们看一下这段代码: 我希望这能打印出“孩子”,但结果是“父母”。为什么Java会改为调用父类,我该怎么做才能使其在子类中调用方法? 问题答案: 不会覆盖,因为它没有相同的形式参数。一个拿走,另一个拿走。因此,运行时的多态不会被应用,并且不会导致子类方法的执行。根据Java语言规范: 如果满足以下所有条件,则在类C中声明或由类C继承的实例方法从类C中 重写 另一个在类A中声明的方法:

  • 我一直认为Mockito工作某种代理之类的东西。但现在我发现,Mockito允许我做一些像 这不适用于代理。它是如何做到这一点的?这种技术可以用来调用内部AOP方法吗?(请参见Spring AOP不适用于另一个方法中的方法调用)

  • 我试图在测试中模拟一个调用,但我得到了一个错误,因为它调用了真正的方法,而不是模拟它。 这是我的方法 } 这是我的测试课 测试实际上调用了受保护的方法config Setter,并在设置代理时失败。帮助我理解我在这里做错了什么。