如何获取服务的spring bean实例,通过webflow中的依赖注入添加

时间:2014-12-29 16:23:21

标签: grails dependency-injection integration-testing spring-webflow grails-controller

我想在一个测试的集成测试中模拟一个服务方法,但是我不知道如何获得对服务的引用,因为它是通过依赖注入添加到控制器的。为了使服务更加复杂,Web服务是在webflow中,但我知道它没有存储在流中,因为服务没有被序列化。

理想的模拟场景:

  1. 获取对服务的引用

  2. 通过metaClass

  3. 模拟方法
  4. 主要测试

  5. 将metaClass设置为null,以便将其替换为原始

  6. 像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
        }
    }
    

2 个答案:

答案 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
}