gpt4 book ai didi

spring - 如何在 grails 服务中使用 DEPENDENCY INJECTION 有选择地设置属性以进行单元测试

转载 作者:行者123 更新时间:2023-12-02 15:14:25 26 4
gpt4 key购买 nike

编辑:请让我说清楚,我问的是如何在 Grails 中使用 Spring Dependency Injection 来做到这一点,而不是 Grails 的元类功能或 new()。

我有一个用于分析日志文件的 grails 服务。在服务内部,我将当前时间用于很多事情。对于单元测试,我有几个使用此服务解析的示例日志文件。这些显然有时间。

我希望我的服务在单元测试期间认为当前时间不超过示例日志文件中最后一个日志语句之后的几个小时。

所以,我愿意这样做:


class MyService {
def currentDate = { -> new Date() }

def doSomeStuff() {
// need to know when is "right now"
Date now = currentDate()
}
}

So, what I want to be able to do is have currentDate injected or set to be some other HARDCODED time, like

currentDate = { -> new Date(1308619647140) }

有没有办法在我的单元测试中使用一些 mockWhatever 方法来做到这一点?使用 Google Guice 做这类事情非常容易,但我不知道如何在 Spring 中做到这一点。

令人沮丧的是,当我在 Google 上搜索“grails 依赖注入(inject)”时,我发现的只是以下示例

class SomeController {
// wow look how amazing this is, it's injected automatically!!
// isn't spring incredible OMG!
def myService
}

感觉向我展示的只是我不必输入 new ...()

我在哪里告诉它,当环境等于测试时,请执行以下操作:

currentDate = { -> new Date(1308619647140) }

我只是在测试中手动设置此属性吗?

我宁愿不必创建“timeService”,因为考虑到我只想要 1 个微小的变化,这似乎很愚蠢。

最佳答案

Groovy 是一种动态语言,因此它允许您做几乎您所要求的事情:

class MyServiceTests extends GrailsUnitTestCase {
def testDoSomeStuff() {
def service = new MyService()
service.currentDate = { -> new Date(1308619647140) }

// assert something on service.doSomeStuff()
}
}

请记住,这只会修改 service实例,而不是类。如果您需要修改类(class),您需要使用 metaClass .看看 this postmrhaki .

另一种选择是将当前日期作为 doSomeStuff() 的参数。 .这样你就不需要修改你的服务实例。

关于spring - 如何在 grails 服务中使用 DEPENDENCY INJECTION 有选择地设置属性以进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6419439/

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