关于spring服务类的jUnit:没有这样的bean定义

时间:2015-11-05 15:45:03

标签: java spring hibernate spring-mvc junit

EDIT2:我已经设法"修复"问题...只需删除Autowired注释并使用setUp / tearDown配置。所以,为了补充我的问题,为什么没有自动装配的注释工作(班级找到路径)并且不用它?我在测试上下文文件中做错了吗?

编辑:我要指出我尝试自动装配的是一个实现两个接口的类。我已经看到了(论坛帖子)你不能这样做(所以这可能是我的问题的原因),但是没有设法找到一个真正的,#34;官方和" #34;回答。 所以,对于我所见过的,我应该" autowire"一个对一个接口的引用和对另一个接口的另一个引用,并且Spring神奇地认为我试图测试该特定的实现。是对的吗?如果是这样,为什么?

我正在为一个有点大的J2EE项目的jUnit测试工作,没有Hibernate的经验。我正在使用每个包的包,使用大多数预先配置的文件来进行测试,因此配置的确切细节对我来说有点模糊。但我无法实例化已定义的类(标记为服务)。

我有这个,#34;要测试"类:

package com.stackoverflow.business.service.impl;

@service
public class ClassA Implements InterfaceA<BeanA>, BeanB {
/* Actual implementation of the class*/
}

然后,这个,实际的测试课,请不要介意无用的进口:

package com.stackoverflow.business.service.test;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;

import com.stackoverflow.business.service.impl.ClassA;


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
        "classpath:/spring/integration-core-config.xml",
        "classpath:/spring/app-custom-persistence-hibernate.xml", 
        "classpath:/spring/app-test-persistence-hibernate.xml",
        "classpath:/spring/app-custom-reporting.xml",
        "classpath:/spring/test-context.xml"})
public class ClassATest{
@Autowired
    private ClassA classATestInstance;
/* Rest of the implementations*/
}

AFAIK,4个第一个xml文件是测试的标准。我添加了test-context.xml,希望spring能够通过以下配置找到我尝试测试的内容(而且似乎在没有此xml的情况下运行测试导致相同的错误):

<?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans 
               http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
               http://www.springframework.org/schema/tx 
               http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
               http://www.springframework.org/schema/context
               http://www.springframework.org/schema/context/spring-context-3.1.xsd
               http://www.springframework.org/schema/aop 
               http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">

    <context:component-scan base-package="com.stackoverflow.business.service.impl" />   

    <bean id="ClassATest" class="com.stackoverflow.business.service.impl"></bean>

</beans>

希望那里没有拼写错误。方向是正确的,包名称是正确的,但是当spring尝试创建ClassA实例(ClassATestInstance)时,我得到BeanCreationException,告诉我它没有找到ClasA bean。

我从未尝试使用@Service注释来测试类,所以我不确定即使我能够/应该这样做,但是对于同一个包上的先前类(尽管没有注释),使用用于定义bean的test-context.xml文件工作正常。

我在这里失踪了什么?

编辑:添加了异常文本(仅限第一行以避免混乱):

org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'com.stackoverflow.business.service.test.ClassATest' 
Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: 
Could not autowire field: private com.stackoverflow.business.service.impl.ClassA com.stackoverflow.business.service.test.ClassATest nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.stackoverflow.business.service.impl.ClassA] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

1 个答案:

答案 0 :(得分:0)

您可以尝试使用ClassATest注释@WebAppConfiguration,如下所示:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
            "classpath:/spring/integration-core-config.xml",
            "classpath:/spring/app-custom-persistence-hibernate.xml", 
            "classpath:/spring/app-test-persistence-hibernate.xml",
            "classpath:/spring/app-custom-reporting.xml",
            "classpath:/spring/test-context.xml"})
@WebAppConfiguration
public class ClassATest{