简体   繁体   中英

How to mock a service or stub a service method in a Spring Boot filter using Spock?

Currently i have a filter in my Spring Boot application that uses a Spring service to do some of the heavy lifting stuff..

public class HmacAuthenticationFilter implements Filter {

    @Autowired
    MyService myservice

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        myservice.callMethod();
    }
}

In my Spock test I would like to mock the entire service that the filter uses or stub the myservice.callMethod(); to return a specific value.

Any hints on how this could be done?

It could be done using HotSwappableTargetSource

@WebAppConfiguration
@SpringApplicationConfiguration(TestApp)
@IntegrationTest('server.port:0')

class HelloSpec extends Specification {

@Autowired
@Qualifier('swappableHelloService')
HotSwappableTargetSource swappableHelloService

def "test mocked"() {
  given: 'hello service is mocked'
  def mockedHelloService = Mock(HelloService)
  and:
  swappableHelloService.swap(mockedHelloService)

  when:
  //hit endpoint
  then:
  //asserts 
  and: 'check interactions'
  interaction {
      1 * mockedHelloService.hello(postfix) >> { ""Mocked, $postfix"" as String }
  }
  where:
  postfix | _
  randomAlphabetic(10) | _
}
}

And this is TestApp (override the bean you want to mock with proxy)

class TestApp extends App {

//override hello service bean
@Bean(name = HelloService.HELLO_SERVICE_BEAN_NAME)
public ProxyFactoryBean helloService(@Qualifier("swappableHelloService") HotSwappableTargetSource targetSource) {
def proxyFactoryBean = new ProxyFactoryBean()
proxyFactoryBean.setTargetSource(targetSource)
proxyFactoryBean
}

@Bean
public HotSwappableTargetSource swappableHelloService() {
  new HotSwappableTargetSource(new HelloService());
}
}

Have a look at this example https://github.com/sf-git/spock-spring

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM