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

Java 使用Springs@Autowired进行独立JUnit测试,java,unit-testing,spring,junit,autowired,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; @

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

@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());
  }
@RunWith(SpringJUnit4ClassRunner.class)
@交易的
@肮脏的环境
@ContextConfiguration(位置={“/web test.xml”})
公开考试{
@自动连线
XX XX;
@自动连线
HibernateTemplate模板;
@试验
public void testSetGetXXValue()引发异常{
最终映射profilMap=新的HashMap(2);
profilMap.put(“1”,新YY());
profilMap.put(“2”,新YY());
simpleCockpit.setValues(profilMap);
assertEquals(profilMap,simpleCockpit.getValues());
}
正如您所看到的,第一个测试方法改变了autowired XX类。这会影响到以下所有测试方法,这些测试方法依赖于XX具有autowired值

如何测试XX的getter和setter,并确保XX具有其余测试方法的自动连接值?

想法:

  • 在测试方法结束时重置正确的值。不好,因为如果getter/setter不工作,这也将不工作
  • 将第一个测试方法放在测试类的末尾。错误,因为这会使测试依赖于它们的执行顺序
  • 不要测试XX.Bad的getter/setter,因为getter/setter必须像所有方法一样进行测试
谢谢你的回答!我很确定这有一个简单的解决方案…:)


编辑:关于单元测试getter/setter与否的问题,我决定这样做主要是因为statet的原因。

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

从Java文档:

测试注释,该注释指示{@link org.springframework.context.ApplicationContext ApplicationContext} 与测试相关联的设备脏,应关闭:

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

甚至在测试驱动开发中(据我所知):只为复杂度最低的东西编写显式测试。所以我从不为getter和setter编写显式测试。我通常有一个测试来检查一些功能,当这个功能需要getter和setter时,我就编写这个getter和setter(此时)它们是否工作将由我开始使用的隐式功能进行检查



特别是在您的例子中:为什么要使用Springbean,为什么不使用用
new
创建的“普通”对象。我使用“普通”类,只要它对测试有用,主要用于简单的测试。我使用Springbean进行“更大”的测试测试也是如此。

@DirtiesContext正是我想要的。谢谢。我想自动连接这个bean,因为它是一个从数据库传递测试数据的DAO。