0
我已經看過如何通過模擬Static方法對使用Utility類的類進行單元測試,但是我還沒有弄清楚如何單元測試實際的效用類。如何使用Powermockito在Java中測試實用程序類
下面是工具類
public class DbNameContextHolder {
private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
public static void setDbName(String dbName){
contextHolder.set(dbName);
}
public static String getDbName(){
return (String) contextHolder.get();
}
public static void clearDbName(){
contextHolder.remove();
}
}
這是我到目前爲止已經試過了單元測試
@RunWith(PowerMockRunner.class)
@PrepareForTest({DbNameContextHolder.class, ThreadLocal.class})
public class DbNameContextHolderTest {
@SuppressWarnings("rawtypes")
@Mock
ThreadLocal threadLocalMock;
@Before
public void init() throws Exception{
PowerMockito.whenNew(ThreadLocal.class).withNoArguments().thenReturn(threadLocalMock);
}
@Test
public void setsDBName(){
DbNameContextHolder.setDbName("someName");
verify(threadLocalMock).set("someName");
}
@Test
public void getsDbName(){
DbNameContextHolder.getDbName();
verify(threadLocalMock).get();
}
@Test
public void clearsDBName(){
DbNameContextHolder.clearDbName();
verify(threadLocalMock).remove();
}
}
如何嘲笑一個實用工具類這樣嗎?
爲什麼你甚至在這裏使用模擬?爲什麼不測試類的預期**行爲**:從線程1調用getDbName()應該返回null。設置名稱,然後從線程1獲取它應該返回名稱。從線程2獲取它仍然應該返回null。等等。 –
@JBNizet謝謝,這是我需要的方向。我變得太複雜了。 –
你應該問自己你的測試的目的是什麼。通常你不應該測試實現的細節(方法x和對象y被調用),但是如果你的類的合約被保留。 –