我正在尝试使用JUnit和espresso构建活动测试。
但是我遇到了一个问题。我的活动取决于之前应该从数据库加载用户数据的活动。
我将用户数据存储在私有变量中(以防止任何不必要的更改)以及向其应用值的唯一方法是使用loadFromDatabase
方法。
但是我在测试时不能使用这个方法,因为它有一个回调监听器(它向服务器发送请求),我需要立即加载这些数据以加载活动
public User {
private static User mCurrentUser = ...;
public static void loadFromDatabase() { ... }
}
public MainActivityTest {
public MainActivityTest() {
// load the data
User.loadFromDatabase({
// on complete callback
})
// load the activity
activity = new ActivityTestRule(MainActivity.class)
}
}
public MainActivity extends Activity {
public void onCreate() {
// needs the user data
User.mCurrentUser...
}
}
如何在不公开mCurrentUser
的情况下处理此类问题?
有没有办法在常规类中创建方法只是为了测试?
感谢。
答案 0 :(得分:0)
你可以嘲笑它。对于模拟,你可以使用像Mockito&amp ;;这样的模拟库。 PowerMockito
在User中创建一个方法以返回值并模拟该方法。如果您希望此方法专门用于测试,则使用@VisibleForTesting标记它以限制对它的访问。 例如;
public class User{
private static User mCurrentUser;
public static User getCurrentUser(){
return mCurrentUser;
}
}
@RunWith(PowerMockRunner.class)
@PrepareForTest(User.class)
public MainActivityTest{
@Test
public void testCurrentUser{
User probableUserDataFromDB = Mockito.mock(User.class); // Create a mock instance of User class with some expected behaviour for testing purpose
Mockito.when(probableUserDataFromDB.getUserName).thenReturn("my unique name");
PowerMockito.mockstatic(User.class); // Readying the static methods for mocking
Mockito.when(User.getCurrentUser).thenReturn(probableUserDataFromDB);// mock static method and return a mocked user instance with some expected behaviour
//continue with your test.................
}
另请阅读pros & cons:)。