我的应用程序连接到db并从此处获取类别树。在调试方案中,我可以看到这个大树对象,我只想到能够将这个对象保存在磁盘上的某个地方,以便在测试存根中使用。像这样:
mockedDao = mock(MyDao.class);
when(mockedDao.getCategoryTree()).thenReturn(mySavedObject);
假设mySavedObject
- 足够大,所以我不想手动生成它或编写特殊代代码。我只是希望能够在调试会话期间将其序列化并保存在某处,然后对其进行反序列化并在测试中传递给thenReturn
。
是否有标准的方法可以这样做?如果不是如何更好地实施这种方法?
答案 0 :(得分:2)
我做喜欢你的想法,真棒!
我不知道一个可以提供该功能的库。如果对象全部实现ObjectOutoutStream
,则可以尝试使用ObjectInputStream
和Seriablizable
(即标准Java序列化)。通常他们没有。在这种情况下,您可能会使用XStream或其中一位朋友获得更多运气。
答案 1 :(得分:1)
我们通常模拟整个数据库是这样的场景,重用(并隐式测试)代码来从DB加载类别。
具体来说,我们的单元测试针对内存数据库(hsqldb)运行,我们在每次测试运行之前通过导入测试数据进行初始化。
答案 2 :(得分:0)
查看Dynamic Managed Beans - 这提供了一种更改正在运行的Java应用程序的值的方法。也许有一种方法来定义一个保存树的MBean,读取树,将其存储在某处并稍后再次注入。
答案 3 :(得分:0)
我遇到了同样的问题并考虑了可能的解决方案。几个月前,我编写了自定义代码以将大型二进制对象打印为十六进制编码的字符串。我的 toJava() 方法返回一个字符串,它是所需对象的字段定义的源代码。这并不难实现。我将日志语句放入以将结果打印到日志文件中,然后从日志文件中剪切并粘贴到测试类中。新的单元测试引用该文件,使我能够深入研究对象上的操作,而这种操作很难以另一种方式构建。
这非常有用,但我很快就达到了编译单元中字节码大小的限制。