2012-02-05 134 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