我如何将“nulls”注入自动布线的弹簧豆?

问题描述:

我在写单元测试,并且有一个相当复杂的设置。我如何将“nulls”注入自动布线的弹簧豆?

依赖bean设置一些侦听器并将它们传递给自动装配的服务。

我想测试一下侦听器是否存在,但不会调用它们,所以我想通过'null'而不是autowired服务。 (具体是:我没有制定者...)

@Autowired 
SomeService1 service1 

@Autowired 
SomeService2 service2 


public List getListeners() { 
    List l = new ArrayList(); 
    l.add(new AaaListener(service1)); 
    l.add(new BbbListener(Service2)); 
    return l; 
} 

@Test 
public void testListeners() { 
    int exptecedSize = 2; 

    sut.doSomething(); 

    List l = sut.getX().getY().getListeners() 

    assertEquals(expectedSize,l.size()); 
} 

注意,SUT确实间接地从返回听众类的依赖。

由于这是一个非常小的例子,来自一个大的设置,我做了具体的不想在这里使用模拟因为我想测试只存在不是听众的行为。

嘲笑这样的服务20或30会大大减缓测试。

问题:将这些空值注入自动布线实例变量的最简单方法是什么?

A)添加setters?

B)ReflectionUtils?

C)java-config + @Beans + return null?

+0

回答过的问题在这里: http://*.com/questions/3279868/how-to-turn-spring-autowired-required-property-to-false-for-test – Bastl 2013-05-03 09:40:44

当类被实例化时它们已经是null ......或者你是否真的在春天的环境中运行它们?

您可以设置属性的XML配置如下(从documentation)为空

<bean class="ExampleBean"> 
    <property name="email"><null/></property> 
</bean> 
+0

是的,他们在自动布线的春天背景下。我有大约100个豆子手动设置测试,我没有抓住它。我很不情愿地从头开始写一个spring.xml ... – Bastl 2013-05-03 08:54:26

+0

为什么不能让他们注入任何存在的实现呢? – blank 2013-05-03 09:41:42

+0

它太大了:数百个spring.xmls,数千个bean,混合的建筑风格...: - / – Bastl 2013-05-03 11:00:58

  1. 不要使用Spring上下文和创建类手动
  2. 使用ReflectionTestUtils设置领域。 ReflectionTestUtils允许设置私人字段,其中ReflectionUtils不允许。