【问题标题】:Android Room insertion fails on testingAndroid Room 插入在测试中失败
【发布时间】:2018-08-31 18:35:17
【问题描述】:

我正在尝试使用 Roboelectric 作为测试运行器并使用 Mockito 来模拟我的对象来执行单元测试。 我的数据库是这样设置的:

public abstract class DatabaseTest {
protected MyDatabase mDataBase;
@Before
public void initDatabase() throws Exception{
    mDataBase = Room
            .inMemoryDatabaseBuilder(ShadowApplication.getInstance().getApplicationContext(),
                    MyDatabase.class)
            .allowMainThreadQueries()  // To test insert operations on main thread
            .build();
}

@After
public void closeDatabase() throws Exception{
    mDataBase.close();
  }
}

PS:Roboelectric 提供的(影子)上下文是非空的,所以这里没有崩溃问题,即我的数据库实例总是非空的。

这是我真正的 DAO:

@Dao
public interface CountryDAO
{
/***
 * Insert a list of countries in the database. Should an item in the list already exist replace it
 * @param countries
 */
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertAll(List<Country> countries);

/***
 * Get the list of all countries from the database.
 * @return
 */
@Query("SELECT * FROM Country")
List<Country> loadAllCountries();

/***
 * Deletes all the countries from the database
 * Delete statements are automatically wrapped in a transaction.
 */
@Query("DELETE FROM Country")
void deleteAllCountries();
}

这是我的(成功的)DAO 测试类:

@RunWith(RobolectricTestRunner.class)
@org.robolectric.annotation.Config(manifest= Config.NONE)
public class CountryDAOTest extends DatabaseTest
{
private List<Country> countries = Lists.newArrayList(
        EntityUtils.createCountry("1", "China", "001", "+001",
                EntityUtils.createCurrency("1", "Yen")),
        EntityUtils.createCountry("2", "UK", "+002", "+002",
                EntityUtils.createCurrency("2", "Pounds")));


@Test
public void insertAndReadCountriesTest(){
    mDataBase.countryDAO().insertAll(countries);

    assertEquals(2, mDataBase.countryDAO().loadAllCountries().size());
}

@Test
public void testCountryId(){
    mDataBase.countryDAO().insertAll(countries);

    Country country = mDataBase.countryDAO().loadAllCountries().get(1);
    assertEquals("2", country.id);
  }

}

问题出在我现在要测试的 Country 存储库:

我从数据库执行插入和读取操作,但一直没有插入数据集。

这是我的存储库测试类:

@RunWith(RobolectricTestRunner.class)
@org.robolectric.annotation.Config(manifest= Config.NONE)
public class CountryRepoTest
{
@Rule
public MockitoRule mockitoRule = MockitoJUnit.rule();

@Mock
private CountryDAO mockCountryDAO;

@Mock
private MyDatabase mockMyDatabase;

@Before
public void setUp(){
    when(mockMyDatabase.countryDAO()).thenReturn(mockCountryDAO);
}

@Test
public void testDao(){
    List<Country> countries = Lists.newArrayList(
            EntityUtils.createCountry("1", "China", "001", "+001",
                    EntityUtils.createCurrency("1", "Francs CFA")),
            EntityUtils.createCountry("2", "UK", "+002", "+002",
                    EntityUtils.createCurrency("2", "Pounds")));

    mockCountryDAO.insertAll(countries);
    assertEquals(2, mock mockMyDatabase.countryDAO().loadAllCountries().size());
       }
   }

由于某些(不明原因),我的测试失败了。运行者在测试后提供的期望值始终为零,即没有任何国家/地区被插入到数据库中。

我已经用另一个实体尝试过类似的工作流程,一切都很好:我可以在测试时在 DAO 级别执行 CRUD 操作,我也可以在相关存储库级别执行这些操作。 但是对于这个特定的实体,它在测试 Country 存储库时不起作用。

我在这里错过了什么??

【问题讨论】:

    标签: android unit-testing mockito robolectric android-room


    【解决方案1】:

    CountryRepoTest 中,您没有测试任何实现,您只是在调用模拟。在您的测试中,我什至没有看到 CountryRepo 对象。

    【讨论】:

      猜你喜欢
      • 2018-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-13
      • 1970-01-01
      • 2023-01-18
      • 1970-01-01
      相关资源
      最近更新 更多