0

すべての Java スレッドを CPU 時間でソートしたいと考えています。ThreadMXBean を使用して、スレッド ID でスレッドの CPU 時間を取得します。コンパレータは、スレッド ID のソートに使用されます。

public class ThreadStats{
    private static ThreadMXBean mxbean = ManagementFactory.getThreadMXBean();

    class ThreadCPUCompare implements Comparator<Long>{

        @Override
        public int compare(Long threadId1, Long threadId2) {
            return Long.compare(mxbean.getThreadCpuTime(threadId2), mxbean.getThreadCpuTime(threadId1));
        }
    }
}

そして、次の単体テストを作成しました。

@RunWith(MockitoJUnitRunner.class)
public class ThreadStatsTest {

@InjectMocks ThreadCPUCompare comperator = new ThreadStats().new ThreadCPUCompare();
@Mock ThreadMXBean mxbean;

@Test
public void threadCPUSortTest() {
    Mockito.when(mxbean.getThreadCpuTime(1L)).thenReturn(3L);
    Mockito.when(mxbean.getThreadCpuTime(2L)).thenReturn(2L);
    Mockito.when(mxbean.getThreadCpuTime(3L)).thenReturn(4L);
    Mockito.when(mxbean.getThreadCpuTime(4L)).thenReturn(1L);

    List<Long>expectedList = new ArrayList<Long>();
    expectedList.add(3L);
    expectedList.add(1L);
    expectedList.add(2L);
    expectedList.add(4L);

    List<Long>actualList = new ArrayList<Long>();
    actualList.add(4L);
    actualList.add(2L);
    actualList.add(3L);
    actualList.add(1L);


    //Sorting of the actual list
    Collections.sort(actualList, comperator);

    assertEquals(expectedList, actualList);
    }
}

しかし、私はテストを機能させることができません。嘲笑が効かないからだと思います。誰かが単体テストを修正する方法を教えてもらえますか?

4

2 に答える 2

0

テストを作成する簡単な方法の 1 つは次のとおりです。モックは必要ありません。

public class ThreadStatsTest {
    Comparator<Long> comparator = new ThreadStats().new ThreadCPUCompare();

    @Test
    public void orderThreadIdsFromLongestToShortestCPUTime() {
        long longLivedThread = Thread.currentThread().getId(); // > 0 cpu time
        long shortLivedThread = new Thread().getId(); // 0 cpu time

        int longTimeFirst = comparator.compare(longLivedThread, shortLivedThread);
        int sameTimes = comparator.compare(longLivedThread, longLivedThread);
        int longTimeSecond = comparator.compare(shortLivedThread, longLivedThread);

        assertEquals(-1, longTimeFirst);
        assertEquals( 0, sameTimes);
        assertEquals( 1, longTimeSecond);
    }
}
于 2016-06-13T19:49:45.530 に答える
0

モックが注入されていないため、テストは失敗しています。Mockito は、静的フィールドに注入したり、外部クラス (このThreadStats場合のクラスなど) に注入したりしません。

次のようなコードを記述する必要があります。

class ThreadCPUCompare implements Comparator<Long>
{
    private ThreadMXBean mxbean;

    @Override
    public int compare(Long threadId1, Long threadId2) {
        return Long.compare(mxbean.getThreadCpuTime(threadId2), mxbean.getThreadCpuTime(threadId1));
    }
}

@RunWith(MockitoJUnitRunner.class)
public class ThreadStatsTest
{
    @Mock ThreadMXBean mxbean;
    @InjectMocks Comparator comperator = new ThreadCPUCompare();

    @Test
    public void threadCPUSortTest() {
        // do your tests exactly as before
    }
}

次に、それを実稼働コードに配線するという課題がありますが、それは別の演習であり、何らかの依存性注入 (コンテキストと好みに応じて、GUI、Spring、マニュアルなど) をお勧めします。

于 2016-06-08T12:16:12.913 に答える