gpt4 book ai didi

unit-testing - Grails 单元测试服务 MissingProperty 'log'

转载 作者:行者123 更新时间:2023-12-02 13:52:27 24 4
gpt4 key购买 nike

我想对服务进行单元测试。我要测试的方法包括一些 log.debug() 语句。虽然 log 属性是在运行时注入(inject)的,但它似乎并没有在测试中注入(inject),所以它抛出 groovy.lang.MissingPropertyException: No such property: log for class:

这是我的单元测试类:

@TestFor(ServiceUnderTest)
@Mock([ServiceUnderTest])
class ServiceUnderTestTests {

def test() {
def mock = [ mockedProp: [...] ] as ServiceUnderTest
def info = mock.doOperation()
assert ....
}
}

我也尝试添加 MockUtils.mockLogging(ServiceUnderTest) 但没有成功。

如何在单元测试中将日志属性正确地注入(inject)到我的服务类中?

最佳答案

您不必使用 @Mock([ServiceUnderTest]) 注释测试类。 @TestFor(ServiceUnderTest) 检测其服务类并自动执行所有模拟。它还向测试类添加了一个 service 属性,可以在所有测试方法中访问该属性,并相应地模拟 log 属性。

我认为为什么在您的情况下使用 MockUtils.mockLogging(ServiceUnderTest) 进行模拟或显式日志模拟都不起作用的问题是您在测试中使用的 as 强制方法代码:

def mock = [ mockedProp: [...] ] as ServiceUnderTest

Groovy 在内部使用 java.lang.reflect.ProxyServiceUnderTest 创建代理后代类。代理类看不到对 ServiceUnderTest 元类所做的更改,例如添加的 log 属性。

我会通过使用每个对象的元类 来解决这个问题。您可以通过更改 service 对象的 metaClass 来模拟属性 getter(或 setter)。请注意,元类更改会在测试方法执行期间由 Grails 回滚:

service.metaClass.mockedProp = {-> ... }

关于unit-testing - Grails 单元测试服务 MissingProperty 'log',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21775330/

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