java - Groovy/Spock 测试具有成员 @Inject 的 Java 类

标签 java unit-testing groovy spock

我正在尝试测试一个 Java 类,该类具有使用 @Inject 注入(inject)的成员。

我想测试 someMethod

public class SomeJavaClass {

    @Inject
    private SomeFactory someFactory;

    private SomeDAO someMethod(Map someMap) {
        SomeDAO someDAO = someFactory.create();
        //some code
    }
}

我的类没有显式构造函数

最佳答案

如果你的字段是私有(private)的,并且你不使用构造函数,你如何注入(inject)它?我会认为这是一个错误,因为如果你从外部注入(inject)一些东西,你需要为其提供一个接口(interface)。

所以这里有一个 spock 规范,它可以满足您的要求,但将 someFactory 公开为 protected 成员:

import spock.lang.Specification
import spock.lang.Subject

import javax.inject.Inject

interface SomeFactory {
    SomeDAO create()
}

class SomeDAO {

}

class SomeJavaClass {

    @Inject
    protected SomeFactory someFactory;

    protected SomeDAO someMethod(Map someMap) {
        SomeDAO someDAO = someFactory.create();
        //some code
    }
}

class SomeJavaClassSpec extends Specification {

    def someFactory = Mock(SomeFactory)
    @Subject
    SomeJavaClass subject = new SomeJavaClass(
            someFactory: someFactory
    )

    def "It uses a factory to create some object"() {
        when:
        subject.someMethod([:])

        then:
        1 * someFactory.create() >> new SomeDAO()
    }
}

您还可以使用 spock 协作者扩展注释来自动注入(inject)您的协作者 Mock:

https://github.com/marcingrzejszczak/spock-subjects-collaborators-extension

关于java - Groovy/Spock 测试具有成员 @Inject 的 Java 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30577935/

相关文章:

eclipse - Scala Eclipse IDE-奇怪的行为

gradle - 从Artifactory下载后取消解压缩tar.gz文件时出现 'Not in GZIP format'错误

java - 查询 firebase 数据库并检索有限的数据

java.util.list 作为 scala 类方法中的参数在 Java 代码中使用

java - 对来自 NetBeans 的 Web 服务客户端进行单元测试

java - 从 Mockito 切换到 JMockit

Java 8Optional.ofNullable.map产生非静态方法引用错误

java - java.net.Socket 是否检测客户端超时?

java - EasyMock - 覆盖对象创建

java - 混合 Groovy 和 Java 代码在 Jetty 上运行而不会出现 "PermGen Space"错误