Java 模拟引用对象
单元测试时如何避免创建多余的字符串 例如,字符串“SERIALIZED”似乎有点不必要和随意。您会使用什么来代替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
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:没关系。内容可以是随机的,就像我说的——只要它不会导致测试失败(它不应该)。您可以使用比“任意随机内容”
更具描述性的内容,但我更愿意关注变量名来解释字符串的含义。实际内容无关紧要。