测试

时间:2018-03-22 10:47:47

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

我正在尝试使用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);
  }

}

问题是我现在要测试的国家/地区存储库:

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

这是我的存储库测试类:

@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操作,我也可以在相关存储库级别执行这些操作。 但是对于这个特定的实体,它在测试国家资料库时不起作用。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

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