1

私は最近、ユニットテストのテクニックをますます学ぶように自分自身を駆り立ててきましたが、理解できないことに遭遇しました。非常に単純な単一のメソッドでファクトリを単体テストしようとしています。役に立つ人々のために、例の名前を使用して簡略化しました。

public class HandlerFactory extends SecondHandlerFactory
{
    //To hold singleton of this class.
    private static SecondHandler factoryInstance = null;

    private HandlerFactory() throws HandlerCreationException
    {
            super();
    }

    protected InterfaceExample createSomethingByThisKey(String key) throws HandlerCreationException
    {
        InterfaceExample myNewHandler = null;

        if (StringFunctions.isEqualIgnoreCase(key, "Phone"))
        {
            myNewHandler = new PhoneHandler();
        }
    }
}

createSomethingByKey() に陥るようにこのテストをセットアップする方法を理解するのに大きな問題があります。それでも、自分の assertEquals() メソッドを正しく実行する方法を理解することさえできません。

現在、createInstance(); を実行するための準備が整っています。しかし、これに陥る方法については、私には何も意味がないようです。追加された変数とインターフェースは、私をここで混乱させています。テストするのは簡単なようで、非常に短いクラスですが、これにさらされていないこと (Java は私の最初の言語でさえありません) は、私が乗り越えるのが難しい壁のようなものです)。

これらすべてを設定する方法について、標準の JUnit または Mockito を設定する方法についてのヘルプはありますか (実際には関係ありません)。また、適切な標準は単体テストを別のパッケージに含めることであるため、保護されているという事実は私をさらに無知にしています。

4

1 に答える 1

2

正直なところ、あなたの難しさはわかりません。私は2つしか推測できません:

  1. あなたはそのような工場で何をテストするべきかわからない。
  2. 保護されたメソッドのテストに問題があります

1の場合、実際にはそれほど難しくはありません。テストしているメソッドが公開されていると仮定してください。

public class HandlerFactory extends SecondHandlerFactory
{
    public InterfaceExample createSomethingByThisKey(String key) throws HandlerCreationException
    {
        InterfaceExample myNewHandler = null;

        if (StringFunctions.isEqualIgnoreCase(key, "Phone"))
        {
            myNewHandler = new PhoneHandler();
        }
    }
}

このメソッドのロジックは、キーに基づいてハンドラーインスタンスを作成するだけです。したがって、テストでは、キーに従って正しいタイプのハンドラーが作成されるかどうかを確認する必要があります。したがって、テストは次のようになります。

@Test
testCreateSomethingByThisKeyGivenKeyForPhoneKey {
    InterfaceExample result = handelerFactory.createSomethingByThisKey("Phone");
    assertTrue("result is a PhoneHandler", result instanceof PhoneHandler);
}

@Test
testCreateSomethingByThisKeyGivenKeyForUnknownKey {
    InterfaceExample result = handelerFactory.createSomethingByThisKey("NONEXIST");
    assertNull("result", result);
}

問題2(保護されたメソッドへのアクセス制限)の場合、通常2つの選択肢があります。通常、テスト対象システム(SUT)と同じパッケージにテスト対象があるため、保護されたメソッドを呼び出すことができるはずです。

また、SUTの保護されたメソッドに直接委任するメソッドを公開する(またはメソッドの可視性を緩めるためにオーバーライドする)テスト固有のサブクラス(TSS)を作成し、TSSに対してテストを実行することもできます。もちろん、SUTを拡張できることを確認する必要があります。こんな感じかもしれません

public class Sut {
  protected Foo methodToTest(Param param) {
    //....
  }
}

次のようなTSSを作成します。

public class SutTss extends Sut {
  @Override
  public Foo methodToTest(Param param) {  // visibility loosen
    return super.methodToTest(param);
  }
}

次に、その保護されたメソッドを自由にテストできます(Javaではめったに使用されないと思います。SUTと同じパッケージにテストを配置することで、保護されたメソッドをいつでも呼び出すことができます)

于 2012-09-07T04:12:14.673 に答える