Интеграционный тест grails завершается с «Неудовлетворенной зависимостью, выраженной через параметр конструктора» - PullRequest
0 голосов
/ 30 января 2019

grails v3.3.9 jsonView 1.2.10

У меня запрос к классу домена, который не выполняется при выполнении интеграционного теста с классом «Мой класс» «Домен», расширяет ManagedEntity (абстрактный), который расширяет RootEntity (также абстрактный).Устройство имеет два статических запроса withCriteria для выполнения активных выборок.

класс домена Device.groovy:

Device extends ManagedEntity {
OrgRoleInstance org
Site site
Location location
NetworkDomain domain //can only be in one domain or zero
ProviderNetwork vfNetwork  //can be part of one CSP network domain
//simpler option than deviceRoles - not an entity in this case but  a join table
Collection<Resource.ResourceRoleType> roles = [] // creates device_roles table no versioning */
Collection<FlexAttribute> attributes = []
Collection<Equipment> buildConfiguration = []
Collection<Interface> interfaces = []
Collection<Alias> aliasNames = []


boolean freeStanding = false
boolean testDevice = false
Product product  //ref to portfolio offering if exists
String deviceStatus = "Operational"  //or Ceased or ...
String licenceType  //e.g. for cisco 903 would be one of  "metro servcices", or "metro Ip services", "metro aggregation services"
String licence = "none"
String memory
String storage
String numberOfCpu
Software runtimeOS

boolean isTestEntity () {
    testDevice
}

boolean isFreeStanding () {
    freeStanding
}

static hasMany = [deviceRoles: Resource, roles: Resource.ResourceRoleType, attributes:FlexAttribute, buildConfiguration: Equipment, interfaces:Interface, aliasNames:Alias]

static belongsTo = [org:OrgRoleInstance]  //dont at providerNetwork as belongs to as we dont want cascade delete



static constraints = {
    org nullable:true
    site nullable:true
    location nullable:true
    roles nullable:true
    domain nullable:true  , validator : {NetworkDomain domain, Device dev ->
        //assumes org has been set
        if (domain == null)
            return true
        if (dev.org == null)
            log.debug "org was null, trying to validate domain is in orgs.domains list - so org must be set first"
        NetworkDomain[] validDomains = dev?.org?.domains ?: []
        boolean test = validDomains.contains(domain)
        test
    }
    vfNetwork nullable:true , validator : {ProviderNetwork vfNetwork, Device dev ->
        if (vfNetwork == null)  return true
        OrgRoleInstance vf = OrgRoleInstance.findByNameAndRole ("Vodafone", OrgRoleInstance.OrgRoleType.ServiceProvider)
        ProviderNetwork[] networks = vf?.providerNetworks ?: []
        boolean test = networks.contains (vfNetwork)
        if (test == false)
            log.debug "Vodafone provider does not yet have any ProviderNetworks to validate to, please create and save any provider networks before assigning to device, then save "
        test
    }//ensure its in vf's list of provider networks }*/
    product nullable:true
    deviceStatus nullable:true
    licenceType nullable:true
    licence nullable:true
    memory nullable:true
    storage nullable:true
    numberOfCpu nullable:true
    runtimeOS nullable:true
    attributes nullable:true
    buildConfiguration nullable:true
    interfaces nullable:true
    aliasNames nullable:true
}

String toString () {
    "Device (manHostname:$manHostName, opState:$opStatus)[id:$id]"
}

//Queries
static Device getFullDeviceById (Serializable id) {
    Device.withCriteria (uniqueResult:true) {
        join 'domain'
        join 'providerNetwork'
        join 'site'
        join 'location'
        join 'runtimeOS'
        fetchMode 'product', FetchMode.SELECT
        fetchMode 'interfaces', FetchMode.SELECT
        fetchMode 'attributes', FetchMode.SELECT
        fetchMode 'aliasNames', FetchMode.SELECT
        fetchMode 'buildConfiguration', FetchMode.SELECT

        idEq (id as Long)
    }
}

//Queries
static List<Device> getFullDeviceBySite (Serializable sid) {
    Device.withCriteria (uniqueResult:true) {
        join 'domain'
        join 'providerNetwork'
        join 'site'
        join 'location'
        join 'runtimeOS'
        fetchMode 'product', FetchMode.SELECT
        fetchMode 'interfaces', FetchMode.SELECT
        fetchMode 'attributes', FetchMode.SELECT
        fetchMode 'aliasNames', FetchMode.SELECT
        fetchMode 'buildConfiguration', FetchMode.SELECT

        site {idEq (sid as Long)}
    }
}

}

мой тест интеграции интеграции не проходит с этим (как видно изотчет о тестировании)

<testcase time="0.0" name="build relationship between two CI " classname="com.softwood.domain.DeviceIntegSpecSpec">

<failure type="org.springframework.beans.factory.UnsatisfiedDependencyException" message="org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'com.softwood.controller.JsonApiRestfulController': Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'java.lang.Class<?>' available: expected at least 1 bean which qualifies as autowire candidate. 

мой тест с сокращенным задним числом выглядит следующим образом - он просто вызывает статический запрос.(данные загружаются в Bootstrap)

DeviceIntegrationTestSpec

void "построить отношения между двумя CI" () {

    given:

    Device pe = Device.getFullDeviceById(2)

    assert pe

    when : "build a ce and relate the CE and PE  "


    then:

        true


}

Это, похоже, возражает против моего класса Controller (который я не тестирую), который на самом деле работает нормально, когда я запускаю приложение (запускается без ошибок)

Может кто-нибудь объяснить, как это исправить?не уверен, что это связано похожая проблема в плагине someones

Если я запускаю консоль Groovy и запускаю запрос, подобный этому

import com.softwood.domain.Device

Device pe = Device.getFullDeviceById(2)

println pe

, он работает без ошибок- так что это как-то связано с запуском инфраструктуры интеграционного тестирования и не загружая все мои контроллеры

Оцените любую помощь по этому вопросу, я хочу написать некоторые интеграционные тесты и не могу, потому что это блокировщик

1 Ответ

0 голосов
/ 30 января 2019

У вас есть контроллер JsonApiRestfulController, у которого нет конструктора без аргументов.Ваш конструктор ожидает параметр Class.Spring не может узнать, что Class передать, так что это считается недействительным.Возможно, вы хотите, чтобы этот контроллер был абстрактным родительским классом.

РЕДАКТИРОВАТЬ:

Проект на https://github.com/jeffbrown/williamwoodmanconstructor упрощает вашу ситуацию и устраняет большинство несущественныхвещи.https://github.com/jeffbrown/williamwoodmanconstructor/blob/cb799545dfa76f78e8203e68cfadb09aed604544/grails-app/controllers/williamwoodmanconstructor/JsonApiRestfulController.groovy - это проблема.

package williamwoodmanconstructor

import grails.rest.RestfulController

class JsonApiRestfulController<T> extends RestfulController<T> {

    JsonApiRestfulController(Class<T> c) {
        super(c, false)
    }
}

Это недопустимо.Вы можете убедиться в этом, запустив приложение и отправив запрос на номер http://localhost:8080/jsonApiRestful/index.

...