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

时间:2015-06-01 15:54:48

标签: java unit-testing groovy spock

我正在尝试测试一个使用@Inject注入成员的Java类。

我想测试someMethod

public class SomeJavaClass {

    @Inject
    private SomeFactory someFactory;

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

我的班级没有明确的构造函数

2 个答案:

答案 0 :(得分:1)

当然你可以注入私人领域(Guice和Spring可以做到这一点)。你可以使用我的扩展,但如果你添加构造函数会更好,因为它遵循OOP实践。

答案 1 :(得分:0)

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

所以这里有一个spock规范可以满足你的要求,但是将一些工厂暴露为受保护的成员:

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协作者扩展注释自动注入协作者Mocks:

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