2016-03-25 54 views
0

我正在學習JUnit。在處理特定問題時,我決定使用JUnitParams參數提供程序。對於測試方法我寫應該包含兩個輸入值與列表中的每個組參數對其中一個方法調用的結果將測試:如何在JUnitParams參數提供程序中使用Mockito存根控件?

private static final Object[] getConstraints() { 
    return new Object[]{ 
      new Object[]{15, Equipment.WHITEBOARD, Arrays.asList(new Classroom[]{classroomA, classroomB})}, 
      new Object[]{15, Equipment.PROJECTOR, Arrays.asList(new Classroom[]{classroomB})}, 
      new Object[]{15, Equipment.MICROPHONE, Arrays.asList(new Classroom[]{classroomA})}, 
      new Object[]{30, Equipment.WHITEBOARD, Arrays.asList(new Classroom[]{classroomB})}, 
      new Object[]{30, Equipment.PROJECTOR, Arrays.asList(new Classroom[]{classroomB})}, 
      new Object[]{30, Equipment.MICROPHONE, Arrays.asList(new Classroom[]{})}, 
      new Object[]{45, Equipment.WHITEBOARD, Arrays.asList(new Classroom[]{})}, 
      new Object[]{45, Equipment.PROJECTOR, Arrays.asList(new Classroom[]{})}, 
      new Object[]{45, Equipment.MICROPHONE, Arrays.asList(new Classroom[]{})}, 
    }; 
} 

classroomAclassroomB實際上每個測試執行之前準備存根的Mockito :

@Test 
@Parameters(method = "getConstraints") 
public void shouldBookClassroomMeetingConstraints(int capacity, Equipment equipment, List<Classroom> 
     suitableClassrooms) { 
    Assert.assertTrue("Should book a classroom that has a minimum capacity of " + capacity + " and has " + 
      equipment, 
      suitableClassrooms.contains(bookingSystem.book(capacity, equipment, ANY_DAY_OF_WEEK, ANY_HOUR))); 
} 

@Before 
public void setUp() { 
    classroomA = mock(Classroom.class); 
    classroomB = mock(Classroom.class); 
    classrooms = Arrays.asList(new Classroom[]{classroomA, classroomB}); 

    when(classroomA.getName()).thenReturn("A"); 
    when(classroomA.getCapacity()).thenReturn(20); 
    when(classroomA.getEquipment()).thenReturn(Arrays.asList(new Equipment[]{Equipment.WHITEBOARD, Equipment.MICROPHONE})); 

    when(classroomB.getName()).thenReturn("B"); 
    when(classroomB.getCapacity()).thenReturn(40); 
    when(classroomB.getEquipment()).thenReturn(Arrays.asList(new Equipment[]{Equipment.WHITEBOARD, Equipment.PROJECTOR})); 

    bookingSystem = new BookingSystem(classrooms); 
} 

,當我嘗試使用Classroom對象的上述列表中出現的問題10

調試顯示,在第一次運行中,suitableClassrooms包含2個對象,但進一步檢查顯示所有元素均爲空 - 我準備的存根不存在。顯然,測試不會通過或失敗,他們應該通過或失敗。

與Mockito一起使用JUnitParams有沒有限制,還是我使用它們是錯誤的?什麼是正確的方式來使用它們?

這也可能是單元測試的錯誤技術。如果是這種情況,編寫一個測試的正確方法是什麼,以驗證方法調用的結果是否在給定的數組中?

+0

你的問題是什麼?例外? – Evgeny

+0

我的問題是'suitableClassrooms.contains(...)'方法總是返回false,因爲'suitableClassrooms'只有null元素。由於某些原因,模擬存根不在列表中。 –

回答

3

您測試沒有的@Before方法調用,甚至之前@BeforeClass前工作,因爲JUnitParamsRunner亞軍收集的測試參數(即調用getConstraints方法)。因此classroomAclassroomB在那一刻爲空。這就是爲什麼suitableClassrooms由空元素組成。
解決方法是在getConstraints()方法中初始化classroomAclassroomB

另外我相信你可以在這裏擺脫mockito。 Classroom看起來像POJO,沒有必要模擬POJO。在這種情況下,您只需創建Classroom實例並填充必要的數據。

+0

你是對的。我在他們的聲明中初始化了存根:'private static classroom classroomA = mock(Classroom.class);'現在'suitableClassrooms'包含存根並且我的測試通過。至於POJO,我試圖模擬除了SUT之外的所有東西作爲練習。 –

-1

您需要讓班級知道您正在使用Mockito運行測試用例。在課堂上添加以下內容,它應該可以工作。

@RunWith(MockitoJUnitRunner.class) 
+1

我不能這樣做,因爲我的測試類已經用'@RunWith(JUnitParamsRunner.class)'註解了。這個問題在 上討論過http://stackoverflow.com/questions/24431427/multiple-runwith-statements-in-junit –

相關問題