【问题标题】:@Autowired and instantiation@Autowired 和实例化
【发布时间】:2017-08-30 16:06:53
【问题描述】:

我找到了以下代码。

 public class Foo {
   @Autowired
   private MyService myService = new MyService();
 }

这是否意味着 Spring 会覆盖创建 Foo 时创建的 myService 实例?

这段代码可以在 Junit-context 中使用 Foo 而无需在 springcontext 中启动。

这样做可以吗?

【问题讨论】:

  • 您应该使用 Spring 的 JUnit 集成来执行您的测试,而不是这样做。
  • 你应该做一个或另一个,这取决于你是否需要状态
  • 您应该使用 构造函数注入 而不是这样做。这让您两全其美。

标签: java spring dependency-injection


【解决方案1】:

不,这样做是不对的。而是:

@Service
public class Foo {

    private MyService myService;

    @Autowired
    public Foo(MyService myService){
        this.myService = myService;
    }

}´

这样,Spring 在构建 Service 时会注入您所需的依赖项。对于 JUnit 上下文,您只需要自己提供它,它可以是真实实例或模拟:

@Test
public void testFoo(){
    MyService mockService = mock(MyService.class);
    Foo foo = new Foo(mockService);
    foo.myMethod();
    verify(/*Check that foo has done whatever you want with MyService*/);
}

【讨论】:

  • 只是为了添加愚蠢的评论,但有时很有帮助,我相信这里的模拟来自 Mockito 框架?
  • 是的,但你可以使用任何其他模拟库
【解决方案2】:

除了上面的答案,如果您使用 Spring 4,您还可以使用 ContextConfig 运行它,如下所示

使用 SpringBoot,您可以使用 @Bean 注解创建 bean,然后自动装配它

class MyTestConfig{
@Bean
public MyService myService(){
 return new MyService();
};

}

使用 MyTestConfig 作为 contextConfiguration 和 autowire 作为运行测试用例

@Autowired
public MyService myService

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多