0

JMockitCollection.sort(...)で呼び出されるかどうかをテストしたい:

final List<Employee> employees = new ArrayList<>();
new Expectations() {
  {
    Collections.sort((List<Employee>) any);
    result = employees;
  }
};

assertThat(EmployeeRepository.getAllOrderedByName()).isSameAs(employees);

これは、テスト中のサンプル リポジトリの実装です。

public class EmployeeRepository {

  private static List<Employee> employees = new ArrayList<>();

  public static List<Employee> getAllOrderedByName() {
    Collections.sort(employees);
    return employees;
  }
}

単体テストを実行すると、 で NullPointerException が発生しCollections.sortます。デバッガーがgetAllOrderedByNameメソッドのブレークポイントに到達しないため、それ自体をモックする際に問題があるようです。

anyJMockitを使用して静的メソッドをスタブするにはどうすればよいですか?

4

3 に答える 3

1

私があなただったら、このようにはしません。

まず、 on が機能することをテストしComparableますEmployee

Employee次に、クラスのモックを作成します。注:ここではmockitoを使用していますが、これはjmockitに適応できると思います(これは使用したことがありません):

private static final int NR_MOCKS = 20;

// ....

List<Employee> sorted = new ArrayList<>(NR_MOCKS);
for (int i = 0; i < NR_MOCKS; i++)
    sorted.add(mock(Employee.class));

// Create a shuffled list of the sorted list
List<Employee> shuffled = new ArrayList<>(sorted);
Collections.shuffe(shuffled);

// Inject shuffled into repository

// Stubs
for (int i1 = 0; i1 < NR_MOCKS; i1++)
    for (int i2 = 0; i2 < NR_MOCKS; i2++)
        when(sorted.get(i1).compareTo(sorted.get(i2))).thenReturn(i2 - i1);

List<Employee> actual = EmployeeRepository.getAllOrderedByName();

assertEquals(actual, sorted);

リストが最終的にソートされることを確認するだけでなく (Comparable実装を事前にテストしているため)、どのソートアルゴリズムが使用されているかは気にしません。それはただ働く(tm)。

于 2013-06-06T15:52:43.197 に答える
1

それはあなたの特定の質問には答えません(そして、私は過去に自分自身で問題を抱えていたanyので、それを避けようとしています!)、代わりにモックアップを使用できます:

final AtomicBoolean wasCalled = new AtomicBoolean();

new MockUp<Collections> () {
    @Mock
    public <T extends Comparable<? super T>> void sort(List<T> list) {
        wasCalled.set(true);
        //no-op otherwise
    }
};

assertThat(EmployeeRepository.getAllOrderedByName()).isSameAs(employees);
assertTrue(wasCalled.get());
于 2013-06-06T15:43:39.380 に答える