2011-07-21 106 views
6

作为测试驱动开发的初学者,我刚遇到一个问题。我的测试课程开始如下:弹簧独立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方法或不是是否,我决定这样主要是因为原因statet在http://www.sundog.net/sunblog/posts/should-we-test-getters-and-setters/做。

回答

7

如果修改弹簧托管bean,那么可以使用@DirtiesContext注释。这个注解可以放在测试类以及测试方法上!

@DirtiesContext Java文档:

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

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

而且即使是在测试驱动开发(我的理解):写explicite测试仅适用于有一个最低的复杂的东西。所以我从来没有为getter和setter编写明确的测试。我通常有一个测试,检查一些功能,当这个功能需要getter和setter,所以我写这个getter和setter(在这个时间点),它们的工作将由我开始隐式的功能来检查。


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

+0

@DirtiesContext正是我所期待的。谢谢。 我想自动装配这个bean,因为它是从数据库提供测试数据的DAO。 – Steven