编写JUnit测试以检查SharedPreferences数据

时间:2017-09-29 09:14:29

标签: java android unit-testing junit mockito

我不熟悉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();
}

断言会是什么样的?

3 个答案:

答案 0 :(得分:3)

您正在嘲笑Auth,它不会与代码中的任何内容进行交互,因此您无法对其进行任何断言。

您需要改变测试方法:

第一种方法

  • 模拟SharedPreferences.Editor并将其注入Authorization
  • 实例化新的Auth对象并调用authorization.saveAuth(auth)
  • 断言使用预期的json调用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(...)