0

クラスのメソッドを検証するテスト ケースを作成したいと考えています。単体テストで呼び出すべきではないApplicationLauncherメソッドを呼び出すため、モックする必要があるローカルオブジェクトがメソッドに含まれています。launch()

public class RunApp
{
   public void check(String name)
   {
     if(name !=null)
     {
       ApplicationLauncher launcher = Application.getLauncher("launch");
       String appName = name+".bat";
       launcher.launch(appName);
     }
   }
 }

私のJUnitテストコードは以下の通りです:

RunApp runapp = new RunApp();

@Mock
ApplicationLauncher launcher;

@Test
public void test()
{
  runapp.check("test");
  verify(launcher,atLeastOnce).launch(anyString());
}

次のようなモック オブジェクトを返すことができません

when(Application.getLauncher(anyString())).thenReturn(launcher);

getLauncherクラスの静的メソッドなのでApplication。どうすればこれを解決できますか?

4

3 に答える 3

3

より良いアプリケーション設計はApplicationLauncher、インターフェースとして使用し、本番およびテストの実装を作成する(または単にテストの実装をモックする)ことです。おそらくコンストラクターで、のインスタンスをクラスApplicationLauncherに渡す必要があります。RunApp

于 2012-12-05T08:27:29.987 に答える
2

クラスをリファクタリングして、ランチャーを「注入」することを受け入れることができます。

public class RunApp
{
  public void check(String name)
  {
    check(name, Application.getLauncher("launch"));
  }

  protected check(String name, ApplicationLauncher launcher) {
    if (name != null)
    {
      String appName = name + ".bat";
      launcher.launch(appName);
    }
  }
}

そうすれば、パッケージで保護された新しい check() メソッドを使用して、偽のランチャーを使用してコードをテストできます。

于 2012-12-07T13:32:11.147 に答える
2

PowerMockを使用して静的メソッドをモックできますが、静的メソッドの呼び出しが本当に必要かどうかを確認する必要があります。

于 2012-12-05T08:13:04.880 に答える