2017-02-13 7 views
1

Я пытаюсь выполнить единый тест Realm и его взаимодействия, но все идет не так хорошо. Я включил все зависимости и продолжаю смутные ошибки, ниже мой код для класса Helper, который является оберткой над Realm.Испытание единиц измерения в реальном времени

Вопросы

  1. Это правильный способ тестирования Realm?

  2. Как проверить данные, находящиеся в изолированной программной среде приложения, могут ли эти данные тестироваться только с помощью тестов UI/Instrumentation?

  3. Я получаю сообщение об ошибке в настоящее время (ниже), и прежде, чем я получал «АРГУМЕНТЫ конструктор Powermock нуля не существует»

GitHub repo

Ниже приведен текущий код у меня есть для мой тест Единица измерения:

@RunWith(PowerMockRunner.class) 
@PowerMockRunnerDelegate(RobolectricTestRunner.class) 
@Config(constants = BuildConfig.class, sdk = 21, application = CustomApplicationTest.class) 
@PowerMockIgnore({"org.mockito.*", "org.robolectric.*", "android.*", "javax.crypto.","java.security.*"}) 
@SuppressStaticInitializationFor("io.realm.internal.Util") 
@PrepareForTest({Realm.class, RealmConfiguration.class, 
    RealmQuery.class, RealmResults.class, RealmCore.class, RealmLog.class}) 
public class DatabaseHelperTest { 

@Rule 
public PowerMockRule rule = new PowerMockRule(); 

private DatabaseHelper dB; 

private Realm realmMock; 


@Before 
public void setUp() throws Exception { 
    MockitoAnnotations.initMocks(this); 

    mockStatic(Realm.class); 
    mockStatic(RealmConfiguration.class); 
    mockStatic(RealmCore.class); 
    mock(DatabaseHelper.class); 

    final Realm mockRealm = PowerMockito.mock(Realm.class); 
    realmMock = mockRealm; 

    final RealmConfiguration mockRealmConfig = PowerMockito.mock(RealmConfiguration.class); 

    doNothing().when(RealmCore.class); 
    RealmCore.loadLibrary(any(Context.class)); 

    whenNew(RealmConfiguration.class).withAnyArguments().thenReturn(mockRealmConfig); 
    when(Realm.getInstance(any(RealmConfiguration.class))).thenReturn(mockRealm); 
    when(Realm.getDefaultInstance()).thenReturn(mockRealm); 

    when(Realm.getDefaultInstance()).thenReturn(realmMock); 

    when(realmMock.createObject(Person.class)).thenReturn(new Person()); 

    Person person = new Person(); 
    person.setId("2"); 
    person.setName("Jerry"); 
    person.setAge("25"); 

    Person person2 = new Person(); 
    person.setId("3"); 
    person.setName("Tom"); 
    person.setAge("22"); 

    List<Person> personsList = new ArrayList<>(); 
    personsList.add(person); 
    personsList.add(person2); 

    RealmQuery<Person> personRealmQuery = mockRealmQuery(); 
    when(realmMock.where(Person.class)).thenReturn(personRealmQuery); 

    RealmResults<Person> personRealmResults = mockRealmResults(); 
    when(realmMock.where(Person.class).findAll()).thenReturn(personRealmResults); 
    when(personRealmResults.iterator()).thenReturn(personsList.iterator()); 
    when(personRealmResults.size()).thenReturn(personsList.size()); 

    when(realmMock.copyFromRealm(personRealmResults)).thenReturn(personsList); 

    realmMock = mockRealm; 
    dB = new DatabaseHelper(realmMock); 
} 


@Test 
public void insertingPerson(){ 
    doCallRealMethod().when(realmMock).executeTransaction(any(Realm.Transaction.class)); 

    Person person = mock(Person.class); 
    when(realmMock.createObject(Person.class)).thenReturn(person); 

    dB.putPersonData(); 

    verify(realmMock, times(1)).createObject(Person.class); 
    verify(person, times(1)).setId(anyString()); 
} 


@Test 
public void testExistingData(){ 
    List<Person> personList = dB.getPersonList(); 
    //NPE if checking person object properties i.e name, id. Only list size is available why? 
    Assert.assertEquals(2, personList.size()); 

} 

@SuppressWarnings("unchecked") 
private <T extends RealmObject> RealmQuery<T> mockRealmQuery() { 
    return mock(RealmQuery.class); 
} 

@SuppressWarnings("unchecked") 
private <T extends RealmObject> RealmResults<T> mockRealmResults() { 
    return mock(RealmResults.class); 
} 

Ошибка:

org.mockito.exceptions.misusing.NotAMockException: 
Argument passed to verify() is of type Realm$$EnhancerByMockitoWithCGLIB$$317bc746 and is not a mock! 
Make sure you place the parenthesis correctly! 
See the examples of correct verifications: 
verify(mock).someMethod(); 
verify(mock, times(10)).someMethod(); 
verify(mock, atLeastOnce()).someMethod(); 

at com.appstronomy.realmunittesting.db.DatabaseHelperTest.insertingPerson(DatabaseHelperTest.java:133) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
+0

Тот же вопрос с http://stackoverflow.com/questions/34343601/powermockito-notamockexception-on-a-mock. Просто добавление «org.powermock. *» В строку @PowerMockIgnore ... – beeender

ответ

0

https://medium.com/@q2ad/android-testing-realm-2dc1e1c94ee1 есть большое предложение: не макет Realm, а вместо этого используйте временный экземпляр. Оригинальное предложение с инъекцией зависимостей: Использование

RealmConfiguration testConfig = 
    new RealmConfiguration.Builder(). 
     inMemory(). 
     name("test-realm").build(); 

Realm testRealm = Realm.getInstance(testConfig); 

If dependency injection is not possible, you could use

Realm.setDefaultConfiguration(testConfig); 

вместо, который устанавливает Realm возвращенное Realm.getDefaultInstance().


EDIT: Если вы получаете java.lang.IllegalStateException, не забудьте позвонить Realm.init(InstrumentationRegistry.getTargetContext()) заранее.

+0

Это не работает, поскольку оно выдает исключение 'java.lang.IllegalStateException: вызывать' Realm.init (Context) 'перед созданием RealmConfiguration' –

+0

@VictorApoyan : Конечно, вам нужна настройка. Помогло ли редактирование? –