我想在一个测试的集成测试中模拟一个服务方法,但是我不知道如何获得对服务的引用,因为它是通过依赖注入添加到控制器的。为了使服务更加复杂,Web服务是在webflow中,但我知道它没有存储在流中,因为服务没有被序列化。
理想的模拟场景:
获取对服务的引用
通过metaClass
主要测试
将metaClass设置为null,以便将其替换为原始
像mockFor这样的方法到目前为止似乎没有影响服务。
设置示例: 控制器:
package is.webflow.bad
import is.webflow.bad.service.FakeService
class FakeController
{
def index = {
redirect(action: 'fake')
}
def fakeFlow = {
start {
action {
flow.result = fakeService.fakeCall()
test()
}
on('test').to('study')
}
study {
on('done').to('done')
}
done {
System.out.println('done')
}
}
}
服务:
package is.webflow.bad.service
class FakeService
{
def fakeCall()
{
return 'failure'
}
}
测试:
package is.webflow.bad
import static org.junit.Assert.*
import grails.test.WebFlowTestCase
import is.webflow.bad.service.FakeService
import org.junit.*
class FakeControllerFlowIntegrationTests extends WebFlowTestCase
{
def controller = new FakeController()
def getFlow() { controller.fakeFlow }
String getFlowId() { "fake" }
@Before
void setUp() {
// Setup logic here
super.setUp()
}
@Test
void testBasic()
{
startFlow()
assertCurrentStateEquals 'study'
assertEquals 'failure', getFlowScope().result
}
@Test
void testServiceMetaClassChange()
{
// want to modify the metaClass here to return success
startFlow()
assertCurrentStateEquals 'study'
assertEquals 'success', getFlowScope().result
}
}
答案 0 :(得分:0)
您可以使用" @ AutoWired"将服务注入到集成测试中。或使用应用程序上下文,您可以参考我错过了什么吗?
@Autowired
private YourService yourservice;
or
@Autowired
private ApplicationContext appContext;
YourService yourService = (YourService)appContext.getBean("yourService");
答案 1 :(得分:0)
你走了:
void "test something"() {
given: "Mocked service"
someController.someInjectedService = [someMethod: { args ->
// Mocked code
return "some data"
] as SomeService
when: "Controller code is tested"
// test condition
then: "mocked service method will be called"
// assert
}