使用Java Room進行單元測試,你需要遵循以下步驟:
在你的項目的build.gradle
文件中,添加以下依賴項:
dependencies {
def room_version = "2.4.2" // 使用最新版本
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
// For Kotlin, use kapt instead of annotationProcessor
kapt "androidx.room:room-compiler:$room_version"
// Test dependencies
testImplementation "junit:junit:4.13.2"
androidTestImplementation "androidx.test:runner:1.4.0"
androidTestImplementation "androidx.test.espresso:espresso-core:3.4.0"
}
創建一個實體類,例如User
,并使用@Entity
注解標記它。為實體類添加一些屬性和相應的getter和setter方法。
import androidx.room.Entity;
import androidx.room.PrimaryKey;
@Entity
public class User {
@PrimaryKey(autoGenerate = true)
private int id;
private String name;
private int age;
// Getters and setters
}
創建一個名為UserDao
的接口,并使用@Dao
注解標記它。定義一些用于操作User
實體的方法,例如insert()
, delete()
, update()
和query()
。
import androidx.room.Dao;
import androidx.room.Insert;
import androidx.room.Query;
import androidx.room.Update;
@Dao
public interface UserDao {
@Insert
void insert(User user);
@Update
void update(User user);
@Delete
void delete(User user);
@Query("SELECT * FROM User")
List<User> getAllUsers();
}
創建一個名為AppDatabase
的抽象類,并使用@Database
注解標記它。使用@TypeConverters
注解注冊類型轉換器(如果需要)。繼承RoomDatabase
并指定UserDao
。
import androidx.room.Database;
import androidx.room.RoomDatabase;
import androidx.room.TypeConverters;
@Database(entities = {User.class}, version = 1)
@TypeConverters({Converters.class})
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
創建一個名為Converters
的類,并使用@TypeConverters
注解標記它。在這個類中,定義一些類型轉換器,例如將String
轉換為Date
或Date
轉換為String
。
import androidx.room.TypeConverter;
import java.util.Date;
import java.text.SimpleDateFormat;
public class Converters {
@TypeConverter
public static Date fromTimestamp(Long value) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
try {
return dateFormat.parse(value);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@TypeConverter
public static Long dateToTimestamp(Date date) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
try {
return dateFormat.format(date);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
創建一個名為UserDaoTest
的測試類,并使用@RunWith
和@Test
注解標記它。在測試類中,使用@MockBean
注解創建一個AppDatabase
的模擬實例。然后,編寫一些測試方法來測試UserDao
中的方法。
import androidx.room.Room;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class UserDaoTest {
@Mock
private AppDatabase appDatabase;
@Test
public void testInsertAndQueryUser() {
UserDao userDao = Room.getDatabaseBuilder(appDatabase, UserDao.class, "user_db").build().getUserDao();
User user = new User();
user.setName("John Doe");
user.setAge(30);
// Mock the behavior of UserDao methods
when(userDao.insert(user)).thenReturn(1);
when(userDao.getAllUsers()).thenReturn(List.of(user));
// Call the methods and verify the results
int userId = userDao.insert(user);
assertEquals(1, userId);
List<User> users = userDao.getAllUsers();
assertEquals(1, users.size());
assertEquals("John Doe", users.get(0).getName());
assertEquals(30, users.get(0).getAge());
}
}
現在,當你運行UserDaoTest
時,它將使用模擬的AppDatabase
實例來測試UserDao
中的方法。這樣,你可以在不依賴實際數據庫的情況下驗證代碼的正確性。