Spock如何在方法中模拟自动连接类的函数调用

2cmtqfgy  于 2022-09-21  发布在  其他
关注(0)|答案(4)|浏览(166)

我有一个想要测试的类,它看起来像这样:Package com.

import org.springframework.beans.factory.annotation.Autowired;
public class ClassToTest implements InterfaceToTest{

  @Autowired
  AnotherService serviceA;

  @Override
  public List<String> methodToTest(List<String> randomVar){
    ...
    String stringA = serviceA.someFunction(randomVar);
    ...
  }
}

在使用Spock进行测试时,如何模拟调用serviceA.ome Function(随机变量)的结果以返回我选择的任何字符串?

package com.something;
import spock.lang.Shared
import spock.lang.Specification
class TestClass extends Specification{
  @Shared InterfaceToTest classToTest = new ClassToTest()

  static doWithSpring = {
    serviceA(AnotherService)
  }

  def "tests-part-1"(){
    when: "something"
    ...
    then: "expect this"
    ...
  }
}

我不知道从这里到哪里去。我的IDE显示了我添加到测试类中的doWithSpring代码的错误。对如何处理这件事有什么想法吗?

pwuypxnk

pwuypxnk1#

我建议更多地从单元测试的Angular 来考虑它。您想要模拟出Spring框架的东西,并确保您正在测试您的逻辑。使用Spock很容易做到这一点。

ClassToTest myClass = new ClassToTest(serviceA: Mock(AnotherService))

def "test my method"() {
  when:
  myClass.methodToTest([])

  then:
  1 * myClass.serviceA.someFunction([]) >> 'A string'
}

从这里,您可以查看驱动它的数据,或者使用>并传递您想要返回的不同字符串的列表。

r6l8ljro

r6l8ljro2#

启用单元测试的一个简单解决方案是将ClassToTest更改为具有一个构造函数,该构造函数如下所示设置了ServiceA字段:

import org.springframework.beans.factory.annotation.Autowired;
public class ClassToTest implements InterfaceToTest{

private AnotherService serviceA;

@Autowired
public ClassToTest(final AnotherService serviceA){
   this.serviceA = serviceA;
}

@Override
public List<String> methodToTest(List<String> randomVar){
...
String stringA = serviceA.someFunction(randomVar);
...
}
}

然后,在您的Spock单元测试中,您可以在构造函数中提供模拟:

class TestClass extends Specification{
 def mockServiceA = Mock(AnotherService)
 @Shared InterfaceToTest classToTest = new ClassToTest(mockServiceA)

在每个测试用例中,您都可以用通常的Spock方式进行模拟:

lmvvr0a8

lmvvr0a83#

如果你正在进行单元测试,那么就按照@rockympls的建议去做。

如果您正在进行集成/组件测试,那么请包括spock-spring依赖项,并查看SpockMaven提供的test examples。此外,如果您使用的是Spring Boot 1.4+,则可以执行以下操作:

@SpringBootTest(classes = Application)
@ContextConfiguration
class SomeIntegrationTest extends Specification {

    @Autowired
    SomeService someService

    def 'some test case'() {
        ...
    }
}

有关Spring Boot测试内容的更多信息,请参阅this

xlpyo6sf

xlpyo6sf4#

我也遇到了同样的问题,我是这样解决的:

class Service {
  @Autowired MyRepository myRepository
  @Autowired AnotherRepository anotherRepository
}

@SpringBootTest (classes = Service)
ServiceTest extends Specification{

  Service service
  MyRepository myRepository
  AnotherRepository anotherRepository

  def setup{

    myRepository = Mock(MyRepository)
    anotherRepository = Mock(AnotherRepository)

    service = new Service()

    service.myRepository = myRepository
    service.anotherRepository = anotherRepository

  }

}

相关问题