首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >spring接口测试的具体实现

spring接口测试的具体实现
EN

Stack Overflow用户
提问于 2009-12-10 18:16:36
回答 3查看 16.5K关注 0票数 2

我有以下设置:

代码语言:javascript
复制
@Component
public class ImplOne implements IFace{
}

@Component
public class ImplTwo implements IFace{
}

public interface IFace{
}

我试图按类型获取ImplOne的引用:

代码语言:javascript
复制
@RunWith(SpringJUnit4ClassRunner.class)
public class ImplOneTest {
  @Autowired
  private ImplOne impl;

  @Test
  public void test(){
    Assert.assertNotNull(impl);
  }
}

尽管如此,我还是得到了以下例外:

代码语言:javascript
复制
org.springframework.beans.factory.NoSuchBeanDefinitionException:
No matching bean of type [some.package.TestBean] 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)}

我尝试了以下解决办法:

  • 从ImplOne中删除"implements“,这样实现类本身就会被cglib代理。不能接受,因为我还需要能够在我的应用程序代码中获得所有的methods.
  • Changing实现。
  • 通过@Autowired public void setImplOne(IFace[] beans)执行方法注入,并通过instanceof check过滤实例,因为注入bean是java.lang.reflect.Proxy类型的子类,它不提供ImplOne的任何有用的implone@组件(“内嵌”)并使用@Qualifier("implone").

代码:

代码语言:javascript
复制
@RunWith(SpringJUnit4ClassRunner.class)
public class ImplOneTest {
  @Autowired
  @Qualifier("implone")
  private ImplOne impl;

  @Test
  public void test(){
    Assert.assertNotNull(impl);
  }
}

但是,我不喜欢为了能够注入具体的实现而不得不命名bean的想法。

有什么方法可以优雅地做到这一点,或者至少在某种程度上只影响我的测试代码?还有什么特别的原因,为什么我的第一个例子是不支持的?

EN

回答 3

Stack Overflow用户

发布于 2009-12-11 06:48:54

  1. 检查异常是否与您认为的bean有关。由于名称与
  2. 不匹配,即使1是固定的,所以最好是通过接口而不是具体的实现进行自动定位。大多数情况下(我知道在您的情况下是否是这样),具体的实现是由spring代理的(例如,对于事务支持),并且只能通过接口注入。由于有两个接口实现,所以必须提供一个名称,或者使用@Autowired + @Qualifier,或者使用@Resource(name="")注入所需的内容。这没什么不对的。--
票数 3
EN

Stack Overflow用户

发布于 2009-12-22 12:03:24

好吧,今天我找到了一种办法让这件事起作用。这似乎是无法奏效的原因。

目前,我正在使用Eclipse中的AJDT进行编译时编织(CTW)和TransactionAnnotationAspect。我还删除了项目中的aspectjweaver和cglib依赖项,因此在从应用程序上下文中删除以下配置部分之后,甚至不再支持autoproxy:

代码语言:javascript
复制
<aop:pointcut id="serviceOperation" expression="execution(* some.package..*(..)) &amp;&amp; @target(org.springframework.stereotype.Service)" />
    <aop:advisor pointcut-ref="serviceOperation" advice-ref="serviceTxAdvice" />
</aop:config>
<tx:advice id="serviceTxAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="*" read-only="true" propagation="SUPPORTS" />
    </tx:attributes>
</tx:advice>

这也是@Configurable不适合我的原因.

票数 1
EN

Stack Overflow用户

发布于 2012-12-17 08:01:57

添加以下行对我有效:

代码语言:javascript
复制
<aop:aspectj-autoproxy proxy-target-class="true"/>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1882959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档