我正在尝试测试一个 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/