2017-06-28 35 views
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(); 
    } 
} 

如何嘲笑一個實用工具類這樣嗎?

+2

爲什麼你甚至在這裏使用模擬?爲什麼不測試類的預期**行爲**:從線程1調用getDbName()應該返回null。設置名稱,然後從線程1獲取它應該返回名稱。從線程2獲取它仍然應該返回null。等等。 –

+0

@JBNizet謝謝,這是我需要的方向。我變得太複雜了。 –

+0

你應該問自己你的測試的目的是什麼。通常你不應該測試實現的細節(方法x和對象y被調用),但是如果你的類的合約被保留。 –

回答

0

使用評論中的建議我測試了預期的結果。

@RunWith(MockitoJUnitRunner.class) 
    public class DbNameContextHolderTest { 

    @Test 
    public void setsAndGetsDBNameCorrectly(){ 
     DbNameContextHolder.setDbName("someName"); 
     String returnedName = DbNameContextHolder.getDbName(); 
     assertEquals("someName",returnedName); 
    } 

    @Test 
    public void clearsDBName(){ 
     DbNameContextHolder.setDbName("someName"); 
     String returnedName = DbNameContextHolder.getDbName(); 
     assertEquals("someName",returnedName); 
     DbNameContextHolder.clearDbName(); 
     returnedName = DbNameContextHolder.getDbName(); 
     assertNull(returnedName); 
    } 
} 
相關問題