2016-12-28 101 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正常工作。但不是在Spock中。

*

是否有可用SPOCK任何备用的@Autowired?请给我建议一些解决方案&您的意见。

*

回答

1

你的问题是春天的绑定接口与相关执行的能力。

如果您的接口只有一个实现,并且单个实现具有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 
+0

如果我像这样改变, 'public class ctrlClass { @Autowired Aimpl aObj; public int getIdValue(){ return aObj.getId(); } }' 我将无法使用接口A的方法吗? 注意: 但在我目前的继承结构中,我可以使用A和B的接口方法。 –