3

次のようなコード フラグメントを含む古いアプリケーションがあります。

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().getConnection()が null を返したときに、 MyClass.executeSomeSqlStatementがNullPointerExceptionをスローしないことを確認する単体テストを作成したいと考えています。

クラスの設計を変更せずに(シングルトンを削除せずに)どうすれば(ConnectionPool.getInstance().getConnection()をモック)できますか?

4

2 に答える 2

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
于 2013-09-20T07:03:21.303 に答える
4

PowerMock フレームワークを使用することをお勧めします。

それを使用すると、静的メソッドをモックできます。http://code.google.com/p/powermock/wiki/MockStatic

System.currentTimeMillis()これは、モックもできるため、テストが に依存している場合にも非常に役立ちます。

于 2013-09-20T07:03:41.857 に答える