【问题标题】:Save object in debug and than use it as stub in tests在调试中保存对象,而不是在测试中将其用作存根
【发布时间】:2010-12-20 15:18:25
【问题描述】:

我的应用程序连接到 db 并从这里获取类别树。在调试状态下,我可以看到这个大树对象,我只是想到了将这个对象保存在磁盘上某个位置以在测试存根中使用的能力。像这样:

mockedDao = mock(MyDao.class);
when(mockedDao.getCategoryTree()).thenReturn(mySavedObject);

假设mySavedObject - 足够大,所以我不想手动生成它或编写特殊的生成代码。我只想能够在调试会话期间对其进行序列化并将其保存在某处,然后对其进行反序列化并在测试中传递给thenReturn。 有标准的方法吗?如果不是,如何更好地实施这种方法?

【问题讨论】:

  • 那么每个测试用例都需要反序列化吗?或者您想在测试套件的某些设置方法中对其进行反序列化?
  • 想在每次测试运行前反序列化。例如在使用@Before jUnit 注释的方法中。

标签: java unit-testing mocking stub-data-generation


【解决方案1】:

确实喜欢你的想法,太棒了!

我不知道有哪个库可以开箱即用地提供该功能。如果您的对象都实现了Seriablizable,您可以尝试使用ObjectOutoutStreamObjectInputStream(即标准Java 序列化)。通常他们不会。在这种情况下,使用XStream 或它的一位朋友可能会更幸运。

【讨论】:

    【解决方案2】:

    我们通常模拟整个数据库是这样的场景,重用(并隐式测试)代码以从数据库加载类别。

    具体来说,我们的单元测试针对内存数据库 (hsqldb) 运行,我们在每次测试运行之前通过导入测试数据对其进行初始化。

    【讨论】:

      【解决方案3】:

      看看Dynamic Managed Beans - 这提供了一种更改正在运行的java应用程序值的方法。也许有一种方法可以定义一个 MBean 来保存您的树、读取树、将其存储在某个地方并稍后再次注入。

      【讨论】:

        【解决方案4】:

        我遇到了同样的问题并考虑了可能的解决方案。几个月前,我编写了自定义代码以将大型二进制对象打印为十六进制编码字符串。我的 toJava() 方法返回一个字符串,它是所需对象的字段定义的源代码。这并不难实现。我放入日志语句以将结果打印到日志文件,然后从日志文件剪切并粘贴到测试类。新的单元测试引用了该文件,使我能够深入研究很难以其他方式构建的对象上的操作。

        这非常有用,但我很快就达到了编译单元中字节码大小的限制。

        【讨论】:

          猜你喜欢
          • 2011-08-21
          • 1970-01-01
          • 2019-03-20
          • 2014-10-26
          • 1970-01-01
          • 1970-01-01
          • 2014-10-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多