我现在有一个恼人的问题。 我的测试因autowire而失败。
无法自动装配字段:private k.dao.CompanyDao k.dao.CompanyDaoTest.companyDao;嵌套异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:没有为依赖项找到类型为[k.dao.CompanyDao]的匹配bean:期望至少有一个bean可以作为此依赖项的autowire候选者。
我认为@ContextConfiguration可能是问题吗?
测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:**/servlet-context.xml", "classpath:**/root-context.xml", "classpath:**/ccc-jpa.xml" })
public final class CompanyDaoTest {
@Autowired
private CompanyDao companyDao;
@Test
public void testTest() {
}
}
CompanyDao
public interface CompanyDao extends GenericDao<Company> {
}
CompanyDaoJpa
@Repository("companyDao")
public class CompanyDaoJpa extends GenericDaoJpa<Company> implements CompanyDao {
public CompanyDaoJpa() {
super(Company.class);
}
}
GenericDao
public interface GenericDao<T extends DomainObject> {
public T get(Long id);
public List<T> getAll();
public T save(T object);
public T delete(T object);
}
servlet的context.xml中
<annotation-driven />
<context:component-scan base-package="k"/>
答案 0 :(得分:5)
我猜您的测试根本不会加载servlet-context.xml
。
您引用servlet-context.xml
作为类路径资源,但servlet-context.xml
通常位于WEB-INF
下,这不是应用程序类路径的一部分。请注意,当Spring使用通配符(classpath:**/servlet-context.xml
)引用时,Spring不会抱怨丢失配置文件,因此即使无法找到配置文件,您的测试也会以静默方式启动。
没有很好的方法可以从单元测试中访问WEB-INF
中的Spring xml文件。如果要对它们运行测试,则需要将它们移动到类路径(即src
或resources
,具体取决于项目布局)。由于DispatcherServlet
和ContextLoaderListener
期望在WEB-INF
下找到这些文件,因此您还需要使用各自的contextConfigLocation
参数重新配置它们。例如,在DispatcherServlet
:
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:**/servlet-config.xml</param-value>
</init-param>