2

Powermock と Mockito の使用に関する多くの記事を読み、さまざまな方法を試しましたが、以下の静的メソッドを単体テストする方法がまだわかりません。

public static Map<String, String> getEntries() {
    Map<String, String> myEntriesMap = new TreeMap<String, String>();
    ResourceBundle myEntries = ResourceBundle.getBundle(ENTRIES_BUNDLE);
    Enumeration<String> enumList = myEntries.getKeys();
    String key = null;
    String value = null;
    while (enumList.hasMoreElements()) {
        key = enumList.nextElement().toString();
        value = myEntries.getString(key);
        myEntriesMap.put(key, value);
    }
    return myEntriesMap;
}

コードは、このような約 30 の静的メソッドを含む (レガシー) クラスの一部であり、リファクタリングは実際にはオプションではありません。同様に、他のいくつかの静的メソッドでは、DBconnections が取得されています。

例: リソース バンドル ENTRIES_BUNDLE をモックし、このメソッドの単体テストを行うにはどうすればよいですか? すべての静的メソッドに一般的に適用できるパターンを探しています。

4

4 に答える 4

10

ResourceBundle.getBundle( String, ResourceBundle.Control ) を使用して ResourceBundle を取得し、指定された String のバンドルをキャッシュします。ResourceBundle.Control をサブクラス化して、必要な任意のタイプのバンドルを提供できます。

@Test
public void myTest()
{
    // In your Test's init phase run an initial "getBundle()" call
    // with your control.  This will cause ResourceBundle to cache the result.
    ResourceBundle rb1 = ResourceBundle.getBundle( "blah", myControl );

    // And now calls without the supplied Control will still return
    // your mocked bundle.  Yay!
    ResourceBundle rb2 = ResourceBundle.getBundle( "blah" );
}

サブクラス化された Control は次のとおりです。

ResourceBundle.Control myControl = new ResourceBundle.Control()
{
    public ResourceBundle newBundle( String baseName, Locale locale, String format,
            ClassLoader loader, boolean reload )
    {
        return myBundle;
    }
};

ResourceBundle をモックする 1 つの方法を次に示します (読者の演習として残した単体テストに必要なキー/値を TreeMap に入力します)。

ResourceBundle myBundle = new ResourceBundle()
{
    protected void setParent( ResourceBundle parent )
    {
      // overwritten to do nothing, otherwise ResourceBundle.getBundle(String)
      //  gets into an infinite loop!
    }

    TreeMap<String, String> tm = new TreeMap<String, String>();

    @Override
    protected Object handleGetObject( String key )
    {
        return tm.get( key );
    }

    @Override
    public Enumeration<String> getKeys()
    {
        return Collections.enumeration( tm.keySet() );
    }
};
于 2015-02-21T00:18:25.993 に答える
6

ResourceBundle.getBundleメソッドをモックする必要はありません。代わりに、テスト ソース ツリーの適切な場所に ".properties" ファイルを作成するだけです。これは、依然として完全に優れた有用な単体テストです。

于 2013-08-22T13:40:22.447 に答える
0

次のライブラリを使用している場合: mockito-all および jmockit は、次の手順を実行します。

xxxx.class からメソッド yyyy をモックしたいとします。

@MockClass(realClass = xxxx.class)
public static class MyClass {
     @Mock
     public static void yyyy(){
          ......
     }
}

あなたのテストで:

@Test
public void test() {
     Mockit.setUpMock(MyClass.class);
}
于 2013-08-22T11:20:17.133 に答える