2016-12-28 10 views
1

У меня проблема с записью тестовых примеров с использованием SPOCK. Может ли кто-нибудь помочь мне?Как написать класс теста с переменной @Autowired для унаследованного класса

У меня есть классы & интерфейсы, как показано ниже,

//Helper class 

    public class ObjClass{ 

     //Defining all property variables & corresponding getters & setters methods. 

    } 


    //Interface 

    public interface B{ 

     //Declaring custom methods for Mongo repository. 

     public int getId(); 
    } 

    public interface A extends MongoRepository<ObjClass, Serializable>, B{ 

    //Defining some standard MongoRepository methods here 

    } 

    // Implementation Classes 
    public class Aimpl implements B{ 

     //implementing all B interface methods 

    } 

    public class ctrlClass{ 

     @Autowired 
     A aObj; 

     public int getIdValue(){ 
     return aObj.getId(); 
     } 

    } 

И ниже соответствующие тестовые случаи SPOCK:

class test extends Specification 
{ 
    ctrlClass obj1 
    A obj2 //interface class object 


    def setup(){ 
     obj1 = new ctrlClass(); 

     obj2 = new Aimpl(); //Creating object for interface using impl class. 

     obj1.aObj = obj2 

    } 

def "test"(){ 
    when: 
    def a = obj2.getIdValue() 
    then: 
    //validating some conditions here with 'a' value 
} 

} 

Попадая ниже ошибки при выполнении выше теста,

Нельзя лить объект Aimpl в класс A.

Тот же самый сценарий работает отлично с Spring @Autowired. Но не в Споке.

*

Есть ли альтернативный для @Autowired в SPOCK? Пожалуйста, предложите мне несколько решений & ваши комментарии.

*

ответ

1

Проблема у вас есть способность Spring связать интерфейс с соответствующей реализацией.

Если ваш интерфейс имеет только одну реализацию, и в единственной реализации есть аннотация @Component с включенным Spring component scan, чем успех Spring Framework, чтобы установить связь между интерфейсом и его реализацией.

В случае, если сканирование компонентов не включено, компонент должен быть явно определен в вашем файле конфигурации пружины (например, application-config.xml).

Листинг Aimpl и A не может быть успешным, потому что классы/интерфейс наследования различны.

Вы должны изменить код вроде следующего:

public class ctrlClass{ 

    @Autowired 
    Aimpl aObj; 

    public int getIdValue(){ 
    return aObj.getId(); 
    } 
} 

И в тестовый класс внести следующие изменения:

A obj2 //interface class object 

Должен быть изменен на:

Aimpl obj2 
+0

Если я изменить как это, 'public class ctrlClass { @Autowired Aimpl aObj; public int getIdValue() { return aObj.getId(); } } ' Я не смогу использовать метод интерфейса A правильно ?. Примечание: Но в моей текущей структуре наследования я могу использовать методы интерфейса A и B. –