2012-02-05 129 views
2

单元测试时,如何避免创建多余的字符串?模拟参考对象

例如,字符串“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"); 
+0

我没有看到这样的问题。你不是在单元测试运行时创建字符串,它要么进入String字符串池,所以它只创建一次并且总是被重用。 – 2012-02-05 20:03:24

+1

我不太明白这个问题。你可以把两个“SERIALIZED”变成一个常量或局部变量来保存重复? – DNA 2012-02-05 20:05:45

+1

你可以使用anyString()吗? – yadab 2012-02-05 20:55:22

回答

4

我不会打电话给你使用,以验证您的测试是否通过多余字符串。然而,你这样做需要一些重构:

  • 什么"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); 

请注意,字符串的内容变得不相关,考虑变量名称正确描述其目的。

+0

那么你应该把随机内容放在什么位置?空字符串...模拟字符串? – 2012-02-05 22:59:08

+1

@DD:它并不重要。内容可以像我说的那样是随机的 - 只要它不会导致测试中断(它不应该)。您可以使用比“任何随机内容”更具描述性的内容,但我宁愿将注意力放在变量名上,以解释什么是字符串。实际内容无关紧要。 – 2012-02-05 23:02:26