2017-06-28 36 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); 
    } 
} 
相关问题