我正在尝试使用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操作,我也可以在相关存储库级别执行这些操作。 但是对于这个特定的实体,它在测试国家资料库时不起作用。
我在这里缺少什么?
答案 0 :(得分:0)
在CountryRepoTest
中,您没有测试任何实现,只是在调用模拟。我什至在测试中都没有看到CountryRepo
对象。