使用Springs @Autowired进行独立的JUnit测试

时间:2011-07-21 06:38:43

标签: java unit-testing spring junit autowired

作为测试驱动开发的初学者,我刚刚遇到了一个问题。我的测试课程如下:

@RunWith(SpringJUnit4ClassRunner.class)
@Transactional
@DirtiesContext
@ContextConfiguration(locations = {"/web-test.xml"})
public class XXTest {

  @Autowired
  XX xx;

  @Autowired
  HibernateTemplate template;

  @Test
  public void testSetGetXXValue() throws Exception {
    final Map<String, YY> profilMap = new HashMap<String, YY>(2);
    profilMap.put("1", new YY());
    profilMap.put("2", new YY());

    simpleCockpit.setValues(profilMap);

    assertEquals(profilMap, simpleCockpit.getValues());
  }

如您所见,第一种测试方法改变了自动装配的XX级。这会影响所有后续测试方法,这些方法依赖于XX具有自动装配值。

如何从XX测试getter和setter并确保XX具有其他测试方法的自动装配值?

思想:

  • 在测试方法结束时重置正确的值。不好,因为如果getter / setter不起作用,这也行不通。
  • 将第一个测试方法放在测试类的末尾。不好,因为这会使测试依赖于他们的执行顺序。
  • 不要测试XX的getter / setter。不好,因为必须像所有方法一样测试getter / setter。

谢谢你的回答!我很确定这有一个简单的解决方案...... :)

编辑:关于是否单元测试getter / setter的问题,我决定这样做主要是因为http://www.sundog.net/sunblog/posts/should-we-test-getters-and-setters/的状态。

1 个答案:

答案 0 :(得分:7)

如果修改spring托管bean,则可以使用@DirtiesContext Annotation。这个注释可以放在测试类和测试方法上!

来自@DirtiesContext Java Doc:

  

测试注释,表明{@link   org.springframework.context.ApplicationContext ApplicationContext}   与测试相关联的是,应该关闭:

     
      
  • 在当前测试之后,在方法级别声明时
  •   
  • 在当前测试类中的每个测试方法之后,在类中声明   类模式设置为{@link ClassMode#AFTER_EACH_TEST_METHOD的级别   AFTER_EACH_TEST_METHOD}
  •   
  • 在当前测试类之后,声明时   在类级别,类模式设置为{@link ClassMode#AFTER_CLASS   AFTER_CLASS}
  •   

甚至在测试驱动开发中(根据我的理解):只为具有最小复杂性的东西编写明确的测试。所以我从不为getter和setter编写明确的测试。我通常有一个检查某些功能的测试,当这个功能需要getter和setter时,所以我写这个getter和setter(此时),并且他们的工作将由我开始隐式的功能检查。 p>


特别是在你的情况下:为什么你使用Spring Bean,为什么不使用new创建的“普通”对象。我使用“普通”类,只要它对测试有用,主要用于简单测试。我也使用Spring Beans进行“更大”的测试。