Java 模拟引用对象

Java 模拟引用对象,java,unit-testing,mocking,Java,Unit Testing,Mocking,单元测试时如何避免创建多余的字符串 例如,字符串“SERIALIZED”似乎有点不必要和随意。您会使用什么来代替 Object update=new Object(); FileWriter writer=mock(FileWriter.class); Serializer serializer=mock(Serializer.class); when(cache.getWriter(update)).thenReturn(writer); when(s

单元测试时如何避免创建多余的字符串

例如,字符串“SERIALIZED”似乎有点不必要和随意。您会使用什么来代替

    Object update=new Object(); 
    FileWriter writer=mock(FileWriter.class);
    Serializer serializer=mock(Serializer.class);
    when(cache.getWriter(update)).thenReturn(writer);
    when(serializer.serialize(update)).thenReturn("SERIALIZED");

    FileRecorder recorder=new FileRecorder(serializer);
    recorder.receive(update);
    verify(writer).write("SERIALIZED");

我不会调用用于验证测试是否通过的字符串。然而,这样做需要进行一些重构:

  • “序列化的”代表什么?你能在2个月内回忆起它的用途吗
  • 如果您两次使用相同的字符串,那么简单的输入错误(如果发生)将破坏您的测试。这是你想要避免的
我建议将其重构为测试套件范围内的常量(或者测试方法范围内的常量,如果单个测试是您唯一使用它的地方)。并给它取一个恰当的名字:

final String FAKED_SERIALIZER_OUTPUT = "Any random content";
Object update=new Object(); 
FileWriter writer=mock(FileWriter.class);
Serializer serializer=mock(Serializer.class);
when(cache.getWriter(update)).thenReturn(writer);
when(serializer.serialize(update)).thenReturn(FAKED_SERIALIZER_OUTPUT);

FileRecorder recorder=new FileRecorder(serializer);
recorder.receive(update);
verify(writer).write(FAKED_SERIALIZER_OUTPUT);

请注意,字符串的内容变得无关紧要,因为变量名正确地描述了它的用途。

我不会调用用于验证测试是否通过的字符串。然而,这样做需要进行一些重构:

  • “序列化的”代表什么?你能在2个月内回忆起它的用途吗
  • 如果您两次使用相同的字符串,那么简单的输入错误(如果发生)将破坏您的测试。这是你想要避免的
我建议将其重构为测试套件范围内的常量(或者测试方法范围内的常量,如果单个测试是您唯一使用它的地方)。并给它取一个恰当的名字:

final String FAKED_SERIALIZER_OUTPUT = "Any random content";
Object update=new Object(); 
FileWriter writer=mock(FileWriter.class);
Serializer serializer=mock(Serializer.class);
when(cache.getWriter(update)).thenReturn(writer);
when(serializer.serialize(update)).thenReturn(FAKED_SERIALIZER_OUTPUT);

FileRecorder recorder=new FileRecorder(serializer);
recorder.receive(update);
verify(writer).write(FAKED_SERIALIZER_OUTPUT);

请注意,字符串的内容变得无关紧要,因为变量名正确地描述了它的用途。

我看不出这有什么问题。您也没有在单元测试运行时创建字符串——它进入
string
池,因此它只创建一次,并且总是重复使用。我不太明白问题所在。您可以将“序列化”的两个实例提取到一个常量或局部变量中以保存重复?我不认为这有什么问题。您也没有在单元测试运行时创建字符串——它进入
string
池,因此它只创建一次,并且总是重复使用。我不太明白问题所在。您可以将“序列化”的两个匹配项提取到一个常量或局部变量中以保存重复?那么您应该将什么作为随机内容?空串……假串?@DD:没关系。内容可以是随机的,就像我说的——只要它不会导致测试失败(它不应该)。您可以使用比
“任意随机内容”
更具描述性的内容,但我更愿意关注变量名来解释字符串的含义。实际内容是不相关的。那么你应该把什么作为随机内容?空串……假串?@DD:没关系。内容可以是随机的,就像我说的——只要它不会导致测试失败(它不应该)。您可以使用比
“任意随机内容”
更具描述性的内容,但我更愿意关注变量名来解释字符串的含义。实际内容无关紧要。