14

次のようなクラスがあります。

class ClassA {
    private static File myDir;

    // myDir is created at some stage

    private static String findFile(final String fileName) {
       for (final String actualBackupFileName : myDir.list()) {
           if (actualBackupFileName.startsWith(removeExtensionFrom(backupFile))) {
               return actualBackupFileName;
            }
       }
    }
}

したがって、基本的には、File クラスをモックアウトしてこのクラスをテストし、list() が呼び出されたときに、テスト クラスで定義した文字列のリストを返すようにします。

私は次のものを持っていますが、現時点では機能していません。おそらく、私が間違っていることは明らかです-私はJMockitが初めてです-どんな助けも大歓迎です!

@Mocked("list") File myDir;

@Test
  public void testClassA() {
    final String[] files = {"file1-bla.txt"};

    new NonStrictExpectations() {{
      new File(anyString).list(); 
      returns(files);
   }};

   String returnedFileName = Deencapsulation.invoke(ClassA.class, "findFile","file1.txt");

   // assert returnedFileName is equal to "file1-bla.txt"
  }

上記のテストを実行すると、ClassA の myDir フィールドに対して NullPointerException が発生します。適切にモックされていないように見えますか?

4

3 に答える 3

13

Deencapsulation クラスの setField メソッドを使用できます。以下の例に注意してください。

Deencapsulation.setField(ClassA, "File", your_desired_value);
于 2015-08-25T15:15:59.407 に答える
11

JMockit (またはその他のモック ツール) は、フィールドや変数をモックしません。(クラス、インターフェイスなど) をモックします。これらの型のインスタンスがテスト対象のコード内に格納される場所は関係ありません。

のテスト例ClassA:

@Test
public void testClassA(@Mocked File myDir)
{
    new Expectations() {{ myDir.list(); result = "file1-bla.txt"; }};

    String returnedFileName = new ClassA().publicMethodThatCallsFindFile("file1.txt");

    assertEquals("file1-bla.txt", returnedFileName);
}

上記は機能するはずです。privateメソッドを直接テストする (またはprivateフィールドにアクセスする) ことは悪い習慣と見なされるため、ここでは避けました。また、Fileクラスのモックは避けるのが最善です。代わりに、メソッドのみをテストpublicし、ファイルシステムをモックする代わりに実際のファイルを使用してください。

于 2013-07-16T12:57:34.917 に答える
-1

これを試してください:

new Expectations {{
  invoke(File.class, "list", null, null);
  returns(files);
}}
于 2013-07-16T12:50:50.993 に答える