我不熟悉Android中的单元测试,我的尝试是assertTrue
数据已成功传递给方法并保存在SharedPreferences
中。这是我到目前为止的测试:
public class AuthTest {
Authorization authorization = new Authorization();
@Before
public void init() {
MockitoAnnotations.initMocks(this);
}
@Test
public void test_IfAuthIsSaved() {
//test if the auth object is saved in the auth object is saved as a..
//..json string in Shared preferences
Auth auth = mock(Auth.class);
authorization.saveAuth(auth);
//test if the auth is received and saved to sharedpreferences
}
}
saveAuth方法:
public void saveAuth(Auth auth) {
editor.putString("USER_AUTH", new Gson().toJson(auth));
editor.commit();
}
断言会是什么样的?
答案 0 :(得分:3)
您正在嘲笑Auth
,它不会与代码中的任何内容进行交互,因此您无法对其进行任何断言。
您需要改变测试方法:
SharedPreferences.Editor
并将其注入Authorization
。Auth
对象并调用authorization.saveAuth(auth)
。editorMock.putString()
。editorMock.commit()
被调用。 这种方法有一些缺点:
Auth
数据,则需要更改测试SharedPreferences.Editor
的虚假实现并将其注入Authorization
。Auth
对象并调用authorization.saveAuth(auth)
。authorization.getAuth()
保存后检索身份验证,并声明它与您保存的Auth
相同。缺点: *你需要创建一个虚假的``SharedPrefereces.Editor```实现用于模拟相同行为的测试目的
优点: *您的测试不与实施相结合 *您可以自由更改实施而无需更改测试 *您正在测试行为而不是方法
备份第二种方法的一些参考:
现在,从技术角度来看,检索存储对象实际上是创建的一个子集,因为......
Eric Evans的领域驱动设计
答案 1 :(得分:2)
你真的不需要嘲笑Auth
类。更多关于editor
。
1)将new Gson().toJson(auth)
移动到单独的包级别方法中:
JSONObject toJson(Auth auth){
return new Gson().toJson(auth);
}
2)测试:
public class AuthTest {
@InjectMocks
@Spy
Authorization authorization;
@Mock
private Editor editorMock;
@Before
public void init() {
MockitoAnnotations.initMocks(this);
}
@Test
public void test_IfAuthIsSaved() {
// Arrange
JSONObject jsonO = mock(JSONObject.class);
Auth auth = mock(Auth.class);
doReturn(jsonO).when(authorization).toJson(auth);
// Act
authorization.saveAuth(auth);
// Assert
verify(editorMock).putString(Mockito.eq("USER_AUTH"), Mockito.eq(jsonO));
verify(editorMock).commit();
}
}
我假设编辑器是一个实例字段依赖项;
答案 2 :(得分:0)
如果授权构造函数具有SharedPrefrences,该怎么办。
val sharedPreferences = Mockito.mock(SharedPreferences::class.java)
val editor = Mockito.mock(SharedPreferences.Editor::class.java)
Mockito.`when`(sharedPreferences.edit()).thenReturn(editor)
val authorization = Authorization(sharedPreferences)
val auth = ...
authorization.saveAuth(auth)
verify(editor).putString(...)