簡體   English   中英

Groovy / Spock測試具有成員@Inject的Java類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM