3

假设在单元测试中我需要一个对象,其中所有 50 个字段都设置了一些值。我不想手动设置所有这些字段,因为这需要时间和烦人......

不知何故,我需要一个实例,其中所有字段都由一些非空值初始化。

我有一个想法——如果我要调试一些代码,在某个时候我会得到这个对象的一个​​工作实例,并设置了一些数据——我只是将它序列化到磁盘上。

然后我会将这个文件放到 test-resources 文件夹中,在单元测试中只会从那个位置反序列化它。

听起来可行..合理吗?有没有其他想法,或者你会怎么做?

UPD:我同意在这种情况下序列化不好。1)保存的对象不是人类可读的 2)版本可能会改变(极不可能)并且我相信这不是一个大问题......那么,也许有任何可读的易于序列化的格式?

理想情况下,我希望生成实际的源代码。因为它是一个 java bean,所以所有的 getter/setter 都在那里。为什么不在运行时对给定对象生成一组 setter 调用?

4

3 回答 3

1

这个问题已经解决了: https ://github.com/bbottema/lorem-ipsum-objects

于 2013-05-02T11:03:43.903 回答
0

它会起作用,但它的大写 N 很糟糕。

问题是,当有人阅读代码时,很难看到正在使用的值是什么——给定的代码被读取的次数比写入的次数要多得多,你应该针对阅读进行优化。

想到的其他事情:

  • 测试是关于边界的,如果你只使用一组值,你的测试怎么能达到这些边界?
  • 是否每个测试都需要所有 50 个值,所以您的设计可能还有其他问题

如果在每个测试中确实需要设置所有 50 个值,一种更容易的常用方法是使用工厂方法或构建器模式 - 每个都设置合理的默认值并允许您仅覆盖您需要的值。

于 2013-05-02T11:05:12.257 回答
0

为什么不创建一个属性名称与类中的属性完全相同的 .properties 文件。读取此属性文件键/值并通过反射使用键调用设置器。这是执行此操作的基本示例代码:

package consoleouput;

import java.io.FileInputStream; import java.lang.reflect.Method; import java.util.Properties; import java.util.Set;

class Config {  private String a;   private String b;

    public String getA() {      return a;   }

    public void setA(String a) {        this.a = a;     }

    public String getB() {      return b;   }

    public void setB(String b) {        this.b = b;     }

}

public class App {  public static void main(String[] args) {        Properties prop = new Properties();         Config config = new Config();       try {           // load a properties file           prop.load(new FileInputStream("config.properties"));            Set<Object> propKeys = prop.keySet();           for (Object key : propKeys) {
                String keyString = (String) key;
                String keyValue = prop.getProperty((String) key);
                // Make sure you use the key value starting with upper case in
                // properties file
                String keySetterMethod = "set" + keyString;
                System.out.println("Setter method name :" + keySetterMethod);
                // Use reflection to call the method
                Method method = config.getClass().getMethod(keySetterMethod,
                        String.class);

                method.invoke(config, keyValue);            }           System.out.println("Value of a : " + config.getA());            System.out.println("Value of b : " + config.getB());        } catch (Exception e) {             e.printStackTrace();        }   } }

这是示例 cofig.properties 内容:

A=测试 B=休息

注意:您可以使用 csv 使用相同的方法生成不同的对象。

于 2013-05-02T14:15:09.770 回答