如何使用@Autowired变量为继承的类编写测试类

时间:2016-12-28 14:30:21

标签: spring groovy spring-boot junit spock

我在使用SPOCK编写测试用例时遇到问题。有人可以帮帮我吗?

我有课程&接口如下,

    //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一起正常运行。但不是在Spock。

*

  

在SPOCK中是否有@Autowired可供选择?请建议我一些解决方案&amp;你的意见。

*

1 个答案:

答案 0 :(得分:1)

你遇到的问题是Spring能够将接口绑定到相关的实现。

如果您的接口只有一个实现,并且单个实现具有启用Spring component scan的注释@Component,则Spring框架成功推断接口与其实现之间的关系。

如果未启用组件扫描,则应在spring配置文件(例如application-config.xml)中显式定义bean。

Aimpl和A的转换不能成功,因为继承类/接口是不同的。

您应该更改以下代码:

public class ctrlClass{

   @Autowired
   Aimpl aObj;

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

在测试类中进行以下更改:

A obj2   //interface class object

应改为:

Aimpl obj2