unit-testing - Grails Spock 测试 Controller 和服务

标签 unit-testing grails spock

嗨,我有一个名为 ApiController 的 Controller ,它使用名为 ApiService 的服务,如下所示:

def createCategory(){
        def jsonObj = request.JSON
        jsonObj.each{ key, value ->
            params.put(key,value)
        }
        render apiService.createCategory(params)
}

哪个工作正常。
但我似乎无法为它编写测试。

这是我有多远:
@TestFor(ApiController)
@Mock([Category,ApiService])   
class CategorySpec extends Specification {

    def setup() {
    }

    def cleanup() {
    }

    void "test"() {

        setup:
        def apiService = Mock(ApiService)

        when:
        request.method = 'POST'
        request.requestMethod = 'POST'
        params.categoryID = 'test'

        controller.createCategory()

        then:
        println(response)
        1==1

    }

由此我得到以下错误:
java.lang.NullPointerException: Cannot invoke method createCategory() on null object

这显然是因为它看不到我的 apiService bean。所以我的问题是我如何在 Spock 中做到这一点?

最佳答案

它最有可能与 Transactional bug 有关:https://github.com/grails/grails-core/issues/1501

ApiService apiService = new ApiService()
controller.apiService = apiService
apiService.transactionManager = Mock(PlatformTransactionManager) { getTransaction(_) >> Mock(TransactionStatus) }

这是一个临时修复(根据错误报告评论)......这对我有用:)

关于unit-testing - Grails Spock 测试 Controller 和服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26862914/

相关文章:

unit-testing - 在 Grails 3 单元测试中使用 Spock 数据驱动测试

列表对象的 Grails 验证

grails - 使用Grails Spring Security REST插件进行身份验证

grails - 如何在 Grails 中测试非 Controller /域/服务类..

c++ - GMock 将一个模拟对象传递给另一个对象,调用 stub 方法仍然是调用真实逻辑

gradle - 在groovy中用字符%“分割字符串

unit-testing - Spock - 将集合上的断言扩展为单独的测试,例如 @Unroll

python - 无法在 python 中实例化 unittest.Testcase 的子类

android - 如何测试启动 viewModelScope 协程的 ViewModel 函数?安卓 Kotlin

javascript - 如何将 Enzyme Shallow 与 Jest 快照一起使用