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

Ste*_*ven 6 java junit spring unit-testing 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());
  }
Run Code Online (Sandbox Code Playgroud)

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

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

思考:

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

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

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

Ral*_*lph 7

如果修改spring托管bean,则可以使用@DirtiesContextAnnotation.此注释可以放在测试类和测试方法上!

来自@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(此时),并且它们的工作将由我开始隐式的功能检查.


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