【发布时间】: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