我在使用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;你的意见。
*
答案 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