我经常遇到这样的情况:我想将一个大对象图(运行时或调试期间)的内容保存到一组重新创建此对象图的语句中。然后,这可以用作单元测试用例中的测试数据。
对象图的叶子是标准类型(String
,BigDecimal
,Date
等),并且分支遵循bean约定(getters,setters,empty constructor),应该可以生成这种文件(例如TestData.java):
public static Car createCar() {
Wheel wheel1 = new Wheel();
wheel1.setTypePressure( 2.1f );
Wheel wheel2 = new Wheel();
wheel2.setTypePressure( 2.3f );
Wheel wheel3 = new Wheel();
wheel3.setTypePressure( 2.0f );
Wheel wheel4 = new Wheel();
wheel4.setTypePressure( 2.8f );
List<Wheel> wheels = new ArrayList<>( Arrays.asList( wheel1, wheel2, wheel3, wheel4 ) );
Brake brake = new Brake();
brake.setBrakeType( BrakeType.PLAIN );
Car car = new Car();
car.setBrake( brake );
car.setWheels( wheels );
car.setColor( "blue" );
return car;
}
将它以某种方式直接插入到调试会话中真的很棒,但是一些插入语句将“带有内容的java对象图创建代码”输出到System.out
的结果也可以正常工作。< / p>
那么,我怎样才能以最有效的方式实现这一目标?
答案 0 :(得分:2)
好主意,但(可能是自以为是)不是最好的解决方案。
是的,数据可以转换为Java程序;然后需要保存,编译,......
然后出现问题,例如:你想保留源代码,还是编译代码;版本控制(数据或底层JRE)怎么样?
长话短说:Java代码不是一种非常方便的格式来表示数据。因此:不是将数据转换为Java代码,而是将其转换为某些JSON表示形式。
关键在于:当你的课程真正遵循&#34; bean风格&#34 ;;并且他们已经拥有getter / setter / default构造函数 - 然后任何正常的JSON解析器库应该可以正常运行&#34;开箱即用&#34;。你把Car对象扔到它身上;并且很好,标准的JSON。然后你编写一个小帮助工具,读取这些文件并将它们转回Car对象。完成。
这是要走的路(这个建议来自于那些在建筑师想要你正在要求的系统上工作的人;我们花了很多时间和痛苦去那里......但是那个超过10年前;而在2017年,你根本就不再那样做了。)
鉴于您的最新评论(因为您主要对单元测试代码感兴趣);我建议在这里使用构建器模式。
这样你的代码就可以归结为
new CarBuilder().wheel(new WheelBuilder(). ...
关于这一点的好处:有很多方法可以生成这样的构建器;例如,项目Lombok有一个@Builder注释!
无论如何,自动生成构建器的市场非常rich!
答案 1 :(得分:0)
我不知道任何IDE插件可以做到这一点,我找不到谷歌搜索。如果没有其他人编写的现有插件(适用于您的IDE),请回答您的问题:
如何以最有效的方式实现这一目标?
取决于开发插件是否更有效(你自己!)或者继续手动编写测试用例。
我的猜测是后者会更有效率。
我同意@ GhostCat的观点。如果您的测试用例是“数据密集型”,那么最好为测试数据选择/实现基于文本的串行格式,并以这种方式表达测试数据。根据我的经验,以编码为一堆Java调用来构建对象图的测试数据来读取/修改测试数据更容易。重要的是您的测试用例不是“只写”。
答案 2 :(得分:0)
我会将你的图表保持为一些人类可读但可解析的形式。 XML可能是您的最佳选择,因为语法允许跨文档引用,但任何格式都可以工作 - 甚至是自定义语法。这样您就可以在运行时保持并传输图形,同时支持单元测试的易于修改和重复的测试图。