[英]Groovy / Spock test a Java class that has a member @Inject
我正在嘗試測試具有使用@Inject注入的成員的Java類。
我想測試someMethod
public class SomeJavaClass {
@Inject
private SomeFactory someFactory;
private SomeDAO someMethod(Map someMap) {
SomeDAO someDAO = someFactory.create();
//some code
}
}
我的課程沒有明確的構造函數
當然,您可以注入私有字段(Guice和Spring可以做到這一點)。 您可以使用我的擴展名,但是如果添加了構造函數會更好,因為它遵循OOP慣例。
如果您的字段是私有的,並且您不使用構造函數,那么如何注入它呢? 我將假定這是一個錯誤,因為如果您從外部注入某些東西,則需要為其提供一個接口。
因此,這是一個spock規范,可以滿足您的要求,但會將someFactory公開為受保護的成員:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.