2016-03-18 10 views
9

Tôi cần cả Robolectric và Mockito trong bài kiểm tra của tôi, mỗi người đề xuất TestRunner của riêng họ, tôi phải làm gì?Tôi cần cả hai Robolectric và Mockito trong bài kiểm tra của tôi, mỗi người đề xuất TestRunner riêng của họ

tôi có mã này:

@RunWith(MockitoJUnitRunner.class) 
@EBean 
public class LoginPresenterTest { 

    @Bean 
    LoginPresenter loginPresenter; 

    @Mock 
    private LoginView loginView; 

    @AfterInject 
    void initLoginPresenter() { 
     loginPresenter.setLoginView(loginView); 
    } 

    @Test 
    public void whenUserNameIsEmptyShowErrorOnLoginClicked() throws Exception { 
     when(loginView.getUserName()).thenReturn(""); 
     when(loginView.getPassword()).thenReturn("asdasd"); 
     loginPresenter.onLoginClicked(); 
     verify(loginView).setEmailFieldErrorMessage(); 
    } 
} 

Vấn đề là AndroidAnnotations không tiêm phụ thuộc và tôi nhận được một NPE khi cố gắng sử dụng LoginPresenter

Có người nói với tôi để sử dụng các nhà xây dựng LoginPresenter_, vì vậy để tôi có thể tự ép mình phụ thuộc theo cách này:

LoginPresenter loginPresenter = LoginPresenter_.getInstance_(context); 

Để truy cập vào ngữ cảnh, tôi đã phải chuyển từ Bài kiểm tra đơn vị sang Kiểm tra thiết bị Android và thực hiện getInstrumentation().getTargetContext() nhưng tôi muốn Kiểm tra đơn vị chứ không phải các thiết bị đo đạc.

Vì vậy, một người khác bảo tôi sử dụng Robolectric cho điều đó - đó là nghĩa vụ phải có khả năng cung cấp cho tôi ngữ cảnh Ứng dụng.

Tuy nhiên, khi tôi nhìn vào việc trang bắt đầu của Robolectric, nó nói

@RunWith(RobolectricGradleTestRunner.class) 

đó đang xảy ra xung đột với @RunWith chú thích hiện tại của tôi cho Mockito, vì vậy tôi phải làm gì?

Trả lời

17

Sử dụng nhân vật Robolectric. Robolectric sử dụng trình nạp lớp của riêng nó, nó ưu tiên thay thế cho API Android, vì vậy nó thực sự cần phải tự xử lý việc tải lớp. Không có cách nào khác để sử dụng Robolecric.

Có một số cách để khởi tạo Mockito (xem this SO answer), đó là pháp giống hệt nhau để sử dụng các Á hậu, nhưng hai có ý nghĩa nhất đối với trường hợp của bạn là:

  • Sử dụng MockitoRule, bởi vì bạn đang đã có trên Junit4:

    @Rule public MockitoRule rule = MockitoJUnit.rule(); 
    
  • Tạo thủ công @Before@After phương pháp:

    @Before public void setUpMockito() { 
        MockitoAnnotations.initMocks(this); 
    } 
    
    @After public void tearDownMockito() { 
        Mockito.validateMockitoUsage(); 
    } 
    
Các vấn đề liên quan