如何在 Java 中使用 Powermockito 对实用程序 Class 进行单元测试
How to Unit Test a Utility Class with Powermockito in Java
我已经看到如何通过模拟静态方法对使用 Utility classes 的 classes 进行单元测试,但我一直无法弄清楚如何对实际的方法进行单元测试效用 Class.
这是实用程序Class
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();
}
}
如何模拟这样的实用程序 class?
根据评论中的建议,我测试了预期的结果。
@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);
}
}
我已经看到如何通过模拟静态方法对使用 Utility classes 的 classes 进行单元测试,但我一直无法弄清楚如何对实际的方法进行单元测试效用 Class.
这是实用程序Class
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();
}
}
如何模拟这样的实用程序 class?
根据评论中的建议,我测试了预期的结果。
@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);
}
}