【问题标题】:How to test class with @Autowired using Spock如何使用 Spock 使用 @Autowired 测试类
【发布时间】:2016-11-04 17:04:23
【问题描述】:

我在src/groovy 有这样的课程

public class MyClass {

@AutoWired
SomeOtherClass someOtherClass

String test() {
    return someOtherClass.testMethod()
}
}

当我为此方法编写测试时,出现错误:Cannot invoke method testMethod() on null object

这是我的测试:-

def "test test" () {
    expect:
        myClass.test() == "somevalue"
}

我做错了什么?有没有办法模拟 @Autowired 类?

【问题讨论】:

  • 你试过 doWithSpring 闭包吗?

标签: grails testing spock


【解决方案1】:

你需要模拟你的someOtherClass。像这样的

def "test test"(){
    setup:
    myClass.someOtherClass = Mock(SomeOtherClass)
    myClass.someOtherClass.testMethod() >> "somevalue"

    expect:
    myClass.test() == "somevalue"
}

【讨论】:

  • 这仅在存在此行时才有效myClass.someOtherClass.testMethod() >> "somevalue" 而不是这样做我实际上想要来自实际方法的返回值而不是模拟该方法的值。
  • 那么这不是单元测试。您应该在自己的规范SomeOtherClassSpec 中测试someOtherClass.testMethod()。对其他类的调用应该是 Stubbed/Mocked。
【解决方案2】:

虽然前面的答案应该有效,但 spock 提供了更优雅的方式来根据需要注入 bean。您可以使用 doWithSpring 闭包来声明 bean,就像使用 resources.groovy 在 grails 中提供的 spring dsl 支持一样。

class MyClass extends Specification{
def setup(){

   static doWithSpring={
       someOtherClass(SomeOtherClass)
       //declare below if want to inject myClass somewhere else as a bean else not
       /*myClass(MyClass){bean->
          someOtherClass = someOtherClass
      }*/
   }
}

def "test test" () {
    expect:
        myClass.test() == "somevalue"
}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    相关资源
    最近更新 更多