Spring测试的自动问题

时间:2011-11-14 22:13:28

标签: spring testing jpa junit autowired

我花了好几个小时试图找出为什么我的代码会抛出以下异常。在这一点上,我希望有人能比我更聪明,因为我失去了希望......;)

  

由以下原因引起:org.springframework.beans.factory.NoSuchBeanDefinitionException:找不到类型为[com.ls.forecast.jpa.ForecastElementService]的匹配bean依赖:预期至少有1个bean符合此依赖关系的autowire候选者。依赖注释:{@ org.springframework.beans.factory.annotation.Autowired(required = true),@ org.springframework.beans.factory.annotation.Quali   费里(值=主)}   at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:924)   at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:793)   在org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:707)   在org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480)

我没有运气就看了很多线程/教程。他们似乎都和我的一样。我在服务的实现上添加了@Service,我添加了一个限定符,检查了ForecastElementServiceImpl实际上是否实现了接口ForecastElementService。

服务界面:

public interface ForecastElementService {

Collection<ForecastElement> retrieve(String date);
Collection<ForecastElement> retrieve();
}

接口实现:

@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRED)
@Repository("forecastElementService")
@Service
public class ForecastElementServiceImpl implements ForecastElementService {

@PersistenceContext
protected EntityManager em;

@Override
@Cacheable("forecastElements")
public Collection<ForecastElement> retrieve(String date) {
    String sql = null;
    if(date != null) {
        sql = " SELECT fe FROM ForecastElement fe JOIN FETCH fe.forecastType WHERE ?1 between fe.startDate and fe.endDate";
    } else {
        sql = " SELECT fe FROM ForecastElement fe JOIN FETCH fe.forecastType";
    }
    final TypedQuery<ForecastElement> query = em.createQuery(sql, ForecastElement.class);

    return query.getResultList();
}

@Override
@Cacheable("forecastElements")
public Collection<ForecastElement> retrieve() {

    return retrieve(null);
}

}

context.xml中:

<bean id="forecastElementService" class="com.ls.forecast.jpa.ForecastElementServiceImpl">
<property name="entityManagerFactory" ref="entityManagerFactory"/>

最后是故障测试类 - forecastElementService变量是抛出异常的变量。

@Repository
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"*-context.xml"})
public class ModelJpaTest extends AbstractTransactionalJUnit4SpringContextTests {

//final Logger logger = LoggerFactory.getLogger(ModelJpaTest.class);

@Autowired
protected ForecastElementService forecastElementService;

@Autowired
@Qualifier("basicDataSource")
@Override
public void setDataSource(DataSource dataSource) {
    super.setDataSource(dataSource);
}

@Test
public void LoadModelTest() {
    assertNotNull("forecastElementService is null", forecastElementService);
    Collection<ForecastElement> elements = forecastElementService.retrieve();
    assertTrue(elements.size() > 0);
}

}

非常感谢任何见解或帮助!

请参阅@ContextConfiguration ...如果我将ModelJpaTest-context.xml放在我的maven项目的资源(测试)文件夹中并编辑为:

@ContextConfiguration({"/ModelJpaTest-context.xml"})

现在真的很困惑......

3 个答案:

答案 0 :(得分:1)

我需要将注释配置和组件扫描添加到applicationContext.xml,以便它可以正确地“自动装配”bean。完成后,我就可以摆脱测试类中的变量(forecastElementService)。

答案 1 :(得分:0)

至少在你的实现类中没有'entityManagerFactory'。不确定这是否已经导致问题。 你能分享完整的堆栈跟踪(包括嵌套异常)和* context.xml文件的一些片段吗?

编辑:看一下这个答案:Testing against Java EE 6 API

答案 2 :(得分:0)

我建议在服务impl类上使用@Repository或@Service - 但不要同时使用两者。

您可能遇到与未触发的事务相关的另一个问题 - 这里:https://jira.springsource.org/browse/SPR-5082 - 解决方法是在应用程序上下文xml定义文件中定义bean。