作为测试驱动开发的初学者,我刚刚遇到了一个问题。我的测试课程如下:
@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的问题,我决定这样做主要是因为http://www.sundog.net/sunblog/posts/should-we-test-getters-and-setters/的状态。
答案 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进行“更大”的测试。