2017-01-24 2 views
4

Я новичок в тестировании Mockito на Android и не понимаю, как тестировать методы источника данных. Я использую RushOrm, который инициализируется в классе приложений из приложения:Как правильно проверить ORM в android с помощью Mockito?

AndroidInitializeConfig config = new AndroidInitializeConfig(getApplicationContext()); 
List<Class<? extends Rush>> classes = new ArrayList<>(); 
classes.add(CardCollection.class); 
classes.add(Note.class); 
config.setClasses(classes); 
RushCore.initialize(config); 

Мой класс DataSource это:

public class CollectionsRepository implements CollectionDataSource { 

    private static CollectionsRepository INSTANCE = null; 
    private final CollectionDataSource dataSource; 

    // Prevent direct instantiation. 
    private CollectionsRepository(@NonNull CollectionDataSource dataSource) { 
     this.dataSource = checkNotNull(dataSource); 
    } 

    public static CollectionsRepository getInstance(CollectionDataSource dataSource) { 
     if (INSTANCE == null) { 
      INSTANCE = new CollectionsRepository(dataSource); 
     } 
     return INSTANCE; 
    } 

    @Override 
    public void getCollections(@NonNull LoadCollectionsCallback callback) { 
     dataSource.getCollections(callback); 
    } 

    @Override 
    public void getCollection(@NonNull String collectionId, @NonNull GetCollectionCallback callback) { 
     dataSource.getCollection(collectionId, callback); 
    } 

    @Override 
    public void saveCollection(@NonNull CardCollection cardCollection, @NonNull final SaveOrUpdateCollectionCallback callback) { 
     dataSource.saveCollection(cardCollection, callback); 
    } 

    @Override 
    public void updateCollection(@NonNull CardCollection cardCollection, @NonNull SaveOrUpdateCollectionCallback callback) { 
     dataSource.updateCollection(cardCollection, callback); 
    } 

    @Override 
    public void deleteCollection(@NonNull CardCollection cardCollection) { 
     dataSource.deleteCollection(cardCollection); 
    } 

    @Override 
    public void deleteAllCollections(@NonNull RushCallback callback) { 
     dataSource.deleteAllCollections(callback); 
    } 
} 

Это мой тестовый класс для Repository класса:

@Config(constants = BuildConfig.class, sdk = Build.VERSION_CODES.LOLLIPOP, application = ProjectApplication.class) 
@RunWith(MockitoJUnitRunner.class) 
public class CollectionsRepositoryTest { 

    private CollectionPresenter presenter; 

    @Mock 
    private CollectionsRepository repository; 

    @Mock 
    private CollectionContract.View view; 

    @Mock 
    private CollectionDataSourceImplementation dataSource; 

    @Mock 
    private CollectionDataSource.GetCollectionCallback getCollectionCallback; 
    @Mock 
    private CollectionDataSource.LoadCollectionsCallback loadCollectionsCallback; 
    @Mock 
    private CollectionDataSource.SaveOrUpdateCollectionCallback saveOrUpdateCollectionCallback; 

    @Captor 
    private ArgumentCaptor<CollectionDataSource.GetCollectionCallback> getCollectionCallbackArgumentCaptor; 
    @Captor 
    private ArgumentCaptor<CollectionDataSource.LoadCollectionsCallback> loadCollectionsCallbackArgumentCaptor; 
    @Captor 
    private ArgumentCaptor<CollectionDataSource.SaveOrUpdateCollectionCallback> saveOrUpdateCollectionCallbackArgumentCaptor; 

    private static List<CardCollection> collections = Lists.newArrayList(new CardCollection("Title1", "Description1", null), 
      new CardCollection("Title2", "Description2", null)); 
    private final static String collection_title = "title"; 

    @Before 
    public void setUp() { 
     // Mockito has a very convenient way to inject mocks by using the @Mock annotation. To 
     // inject the mocks in the test the initMocks method needs to be called. 
     MockitoAnnotations.initMocks(this); 

     // Get a reference to the class under test 
     presenter = new CollectionPresenter(repository, view); 
    } 

    @Test 
    public void getCollections() { 
     dataSource.getCollections(loadCollectionsCallback); 
     verify(dataSource).getCollections(loadCollectionsCallbackArgumentCaptor.capture()); 
     loadCollectionsCallbackArgumentCaptor.getValue().onSuccess(collections); 
    } 

    @Test 
    public void getCollection() { 
     dataSource.getCollection(collection_title, getCollectionCallback); 
     verify(dataSource).getCollection(eq(collection_title), any(CollectionDataSourceImplementation.GetCollectionCallback.class)); 
    } 

    @Test 
    public void saveCollection() { 
     CardCollection collection = new CardCollection("Title", "Description", null); 
     dataSource.saveCollection(collection, saveOrUpdateCollectionCallback); 
     verify(dataSource).saveCollection(collection, saveOrUpdateCollectionCallbackArgumentCaptor.capture()); 

     saveOrUpdateCollectionCallbackArgumentCaptor.getValue().onSuccess(collection); 
    } 

    @Test 
    public void updateCollection() { 

    } 

    @Test 
    public void deleteCollection() { 

    } 

    @Test 
    public void deleteAllCollections() { 

    } 
} 

Метод saveCollection не работает. Я googling и в основном нахожу, как тестировать прямое соединение sqlite. Любые идеи были бы полезны. Спасибо.

+0

Привет, Какова цель вашего теста? В какой момент вы насмехаетесь. Я не очень хорошо знаю Mockito, но могу помочь вам в том, что делает RushOrm. –

+0

Привет, я хочу проверить работу с RushOrm из приложения, работают исправно. – user1140656

+1

Если вы хотите протестировать фактически библиотеку, вы действительно не хотите что-то насмехаться. Вы можете протестировать его, используя стандартную среду тестирования Android. Возможно, вы захотите высмеять свои собственные классы, но я не думаю, что вы хотите издеваться над материалом данных, потому что тогда вы издеваетесь над тем, что вы на самом деле хотите проверить.RushOrm проведет проверку тестов, может помочь вам начать работу https://github.com/Stuart-campbell/RushOrm/tree/master/RushORM/rushandroid/src/androidTest/java/co/uk/rushorm/android –

ответ

3

Похоже, вы получаете модульное тестирование неправильно:

Что ваши методы делают это:

  • метод испытания вызывает метод объекта издевались
  • , то вы «проверить «что издевавшийся метод был назван

Проще говоря: это не имеет смысла. Идея состоит в том, что вы проходите насмешливые объектов на ваш код производства; и затем вы запускаете какую-то операцию над производственным кодом. И, наконец, вы подтверждаете, что те вызовы, которые вы ожидали увидеть, действительно произошли.

Кроме того: вы не проверяете, что библиотека выполняет то, что она должна делать (ну, по крайней мере, не в модульных тестах).

Вместо этого ваш единичный тест должен проверять только проводки, что и ваша продукция. Другими словами: единственное, что вам нужно проверить, это то, что аргументы, которые ваш производственный код передает некоторому вызову метода библиотеки, являются ожидаемыми.

Конечно, вам нужно пройти тестирование «уровня интеграции», чтобы убедиться, что все это работает от конца до конца. Но это, как правило, за пределами объем единичного теста (поскольку имена уже говорят нам!)

1

Я думаю, что ошибка может быть в этой строке:

verify(dataSource).saveCollection(collection, saveOrUpdateCollectionCallbackArgumentCaptor.capture()); 

Изменение по:

verify(dataSource).saveCollection(collection, saveOrUpdateCollectionCallback); 

Вы не можете проверить метод с другим параметром.

Смежные вопросы