我有一个旧应用程序,其代码片段如下:
public class MyClass
{
public void executeSomeSqlStatement()
{
final Connection dbConn = ConnectionPool.getInstance().getConnection();
final PreparedStatement statement = dbConn.prepareStatement(); // NullPointerException, if ConnectionPool.getInstance().getConnection() returns null
}
}
我想编写一个单元测试,当 ConnectionPool.getInstance()时,验证 MyClass.executeSomeSqlStatement 不会抛出 NullPointerException .getConnection( )返回null。
我怎么能这样做(mock ConnectionPool.getInstance()。getConnection())而不改变类的设计(不删除单例)?
答案 0 :(得分:5)
您可以使用PowerMock,它支持模拟静态方法。
这些方面的东西:
// at the class level
@RunWith(PowerMockRunner.class)
@PrepareForTest(ConnectionPool.class)
// at the beginning your test method
mockStatic(ConnectionPool.class);
final ConnectionPool cp = createMock(ConnectionPool.class);
expect(cp.getConnection()).andReturn(null);
expect(ConnectionPool.getInstance()).andReturn(cp);
replay(ConnectionPool.class, cp);
// the rest of your test
答案 1 :(得分:4)
我建议使用PowerMock框架。
有了它,你可以模拟静态方法。 http://code.google.com/p/powermock/wiki/MockStatic
如果您的测试依赖于System.currentTimeMillis()
,这也非常有用,因为您也可以模拟它。