我想为服务运行单元测试。我想测试的方法包括一些log.debug()
语句。虽然log
属性是在运行时注入的,但它似乎没有在测试中注入,因此抛出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)
,但没有成功。
如何在单元测试中将我的服务类中的log属性正确注入?
答案 0 :(得分:4)
您不必使用@Mock([ServiceUnderTest])
注释测试类。 @TestFor(ServiceUnderTest)
检测到它的服务类并自动执行所有模拟操作。它还为测试类添加了service
属性,可以在所有测试方法中访问,并相应地模拟log
属性。
我认为,在您的情况下,既没有模拟也没有使用MockUtils.mockLogging(ServiceUnderTest)
进行显式日志模拟的问题是您在测试方法代码中使用的as
强制:
def mock = [ mockedProp: [...] ] as ServiceUnderTest
Groovy在内部使用java.lang.reflect.Proxy
从ServiceUnderTest
创建代理后代类。代理类没有看到ServiceUnderTest
元类的更改,如添加的log
属性。
我会使用 per-object元类解决此问题。您可以通过更改metaClass
对象的service
来模拟属性getter(或setter)。请注意,Grails会在执行测试方法之间回滚元类更改:
service.metaClass.mockedProp = {-> ... }