我正在尝试测试一个使用@Inject注入成员的Java类。
我想测试someMethod
public class SomeJavaClass {
@Inject
private SomeFactory someFactory;
private SomeDAO someMethod(Map someMap) {
SomeDAO someDAO = someFactory.create();
//some code
}
}
我的班级没有明确的构造函数
答案 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