为 Android 模拟 AWS Amplify Auth API
Mocking AWS Amplify Auth APIs for Android
我的 Android 应用程序使用 AWS Cognito 和 Amplify Auth SDK 进行身份验证,我正在尝试为 login/signup 流程编写 JUnit 测试用例。我正在使用 Mockito 框架来模拟 类.
我从登录开始,我的登录模型是这样的
class LoginService(val auth: AuthCategory) {
fun login(username: String, password: String): MutableLiveData<Login> {
val liveData = MutableLiveData<Login>()
auth.signIn(username, password,
{ result ->
liveData.postValue(Login(result, null))
},
{ error ->
liveData.postValue(Login(null, error))
}
)
return liveData
}
}
我的视图模型是这样调用的
class LoginViewModel : ViewModel() {
val loginService = LoginService(Amplify.Auth)
fun login(username: String, password: String): MutableLiveData<Login> {
return loginService.login(username, password)
}
}
我的测试用例是这样的
lateinit var auth: AuthCategory
lateinit var loginService: LoginService
@Before
fun onSetup() {
auth = mock(Amplify.Auth::class.java)
loginService = LoginService(auth)
}
@Test
fun loginTest() {
val authSignIn: Consumer<*>? = mock(Consumer::class.java)
val authEx: Consumer<*> = mock(Consumer::class.java)
`when`(
auth.signIn(
anyString(), anyString(),
authSignIn as Consumer<AuthSignInResult>, authEx as Consumer<AuthException>
)
)
loginService.login("username", "password").observeForever {
assertTrue(it.result?.isSignInComplete!!)
}
}
请帮我验证这个方法,
我正在尝试找到一种方法来触发 Auth.signIn()
方法的 AuthSignInResult
和 AuthException
以便我断言登录是否成功或出现错误。
我是 AWS Amplify 和 Cognito 环境的新手,如果 suggestion/reference 以正确的方式执行此操作,我们将不胜感激。提前致谢。
有几种方法可以通过 Amplify Android 鼓励可测试性。在下面的两种方法中,我 肯定 从第一种方法开始。
使用类别界面
这是“单元测试”级别的方法。
Amplify.Auth
实现了 AuthCategoryBehavior
接口。因此,如果您更改所有代码以使用该接口,您只需模拟它即可。
假设您有一些 class 使用 Auth 作为依赖项:
class YourClass(private val auth: AuthCategoryBehavior = Amplify.Auth) {
...
}
现在,在您的生产代码中,您可以让依赖注入代码执行如下操作:
- 初始化放大(使用
addPlugin(AWSCognitoAuthPlugin())
、Ampify.configure(...)
等)
- 接下来,return 一个你的
YourClass
的单身人士,从 YourClass(auth = Amplify.Auth)
构建
但是在您的测试代码中,您可以使用 Amplify Auth 东西的模拟构建 YourClass
的实例:
val mockAuth = mock(AuthCategoryBehavior::class.java)
val yourClass = YourClass(mockAuth)
有了它,您可以指定它在测试条件下的行为方式:
doAnswer
{ invocation ->
// Get a handle to the success callback
val onResult =
invocation.arguments[2] as Consumer<AuthSignInResult>
// Invoke it with some canned result
onResult.accept(mock(AuthSignInResult::class.java))
}
.`when`(mockAuth)
.signIn(eq(username), eq(password), any(), any())
使用 OkHttp 的 MockWebServer
这更像是一种“组件”或“集成”级别的方法。在这里,我们将使用一个 MockWebServer
实例来 return 来自假 Cognito 服务器的罐头响应。
在此流程中,您将在生产和测试中使用所有真正的 Amplify 库代码。只是假装您可以控制 Cognito 对客户端的响应。
为此,您应该在 Android Studio 的网络监视器选项卡中查看 实际 HTTP 响应。然后,将该内容整理到下面的测试代码中。
val mockWebServer = MockWebServer()
mockWebServer.start(8080);
val fakeCognitoEndpointUrl = mockWebServer.url("/");
val cookedResponse = new MockResponse()
.setResponseCode(200)
.setBody(new JSONObject()
.put("blah blah", "content you saw in Network Monitor")
.toString()
)
mockWebServer.enqueue(cookedResponse)
// Build up a JSON representation of your `amplifyconfiguration.json`
// But replace the endpoint URL with mock web server's.
val json = JSONObject()
.put(...)
// Find correct field to populate by
// viewing structure of amplifyconfiguration.json
.put("Endpoint", fakeCognitoEndpointUrl)
val config = AmplifyConfiguration.fromJson(json)
Amplify.addPlugin(AWSCognitoAuthPlugin())
Amplfiy.configure(config, context)
val yourClass = YouClass(auth = Amplify.Auth)
在第二个示例中留下了一些未指定的细节,但希望这足以让您朝着工作方向前进。
我的 Android 应用程序使用 AWS Cognito 和 Amplify Auth SDK 进行身份验证,我正在尝试为 login/signup 流程编写 JUnit 测试用例。我正在使用 Mockito 框架来模拟 类.
我从登录开始,我的登录模型是这样的
class LoginService(val auth: AuthCategory) {
fun login(username: String, password: String): MutableLiveData<Login> {
val liveData = MutableLiveData<Login>()
auth.signIn(username, password,
{ result ->
liveData.postValue(Login(result, null))
},
{ error ->
liveData.postValue(Login(null, error))
}
)
return liveData
}
}
我的视图模型是这样调用的
class LoginViewModel : ViewModel() {
val loginService = LoginService(Amplify.Auth)
fun login(username: String, password: String): MutableLiveData<Login> {
return loginService.login(username, password)
}
}
我的测试用例是这样的
lateinit var auth: AuthCategory
lateinit var loginService: LoginService
@Before
fun onSetup() {
auth = mock(Amplify.Auth::class.java)
loginService = LoginService(auth)
}
@Test
fun loginTest() {
val authSignIn: Consumer<*>? = mock(Consumer::class.java)
val authEx: Consumer<*> = mock(Consumer::class.java)
`when`(
auth.signIn(
anyString(), anyString(),
authSignIn as Consumer<AuthSignInResult>, authEx as Consumer<AuthException>
)
)
loginService.login("username", "password").observeForever {
assertTrue(it.result?.isSignInComplete!!)
}
}
请帮我验证这个方法,
我正在尝试找到一种方法来触发 Auth.signIn()
方法的 AuthSignInResult
和 AuthException
以便我断言登录是否成功或出现错误。
我是 AWS Amplify 和 Cognito 环境的新手,如果 suggestion/reference 以正确的方式执行此操作,我们将不胜感激。提前致谢。
有几种方法可以通过 Amplify Android 鼓励可测试性。在下面的两种方法中,我 肯定 从第一种方法开始。
使用类别界面
这是“单元测试”级别的方法。
Amplify.Auth
实现了 AuthCategoryBehavior
接口。因此,如果您更改所有代码以使用该接口,您只需模拟它即可。
假设您有一些 class 使用 Auth 作为依赖项:
class YourClass(private val auth: AuthCategoryBehavior = Amplify.Auth) {
...
}
现在,在您的生产代码中,您可以让依赖注入代码执行如下操作:
- 初始化放大(使用
addPlugin(AWSCognitoAuthPlugin())
、Ampify.configure(...)
等) - 接下来,return 一个你的
YourClass
的单身人士,从YourClass(auth = Amplify.Auth)
构建
但是在您的测试代码中,您可以使用 Amplify Auth 东西的模拟构建 YourClass
的实例:
val mockAuth = mock(AuthCategoryBehavior::class.java)
val yourClass = YourClass(mockAuth)
有了它,您可以指定它在测试条件下的行为方式:
doAnswer
{ invocation ->
// Get a handle to the success callback
val onResult =
invocation.arguments[2] as Consumer<AuthSignInResult>
// Invoke it with some canned result
onResult.accept(mock(AuthSignInResult::class.java))
}
.`when`(mockAuth)
.signIn(eq(username), eq(password), any(), any())
使用 OkHttp 的 MockWebServer
这更像是一种“组件”或“集成”级别的方法。在这里,我们将使用一个 MockWebServer
实例来 return 来自假 Cognito 服务器的罐头响应。
在此流程中,您将在生产和测试中使用所有真正的 Amplify 库代码。只是假装您可以控制 Cognito 对客户端的响应。
为此,您应该在 Android Studio 的网络监视器选项卡中查看 实际 HTTP 响应。然后,将该内容整理到下面的测试代码中。
val mockWebServer = MockWebServer()
mockWebServer.start(8080);
val fakeCognitoEndpointUrl = mockWebServer.url("/");
val cookedResponse = new MockResponse()
.setResponseCode(200)
.setBody(new JSONObject()
.put("blah blah", "content you saw in Network Monitor")
.toString()
)
mockWebServer.enqueue(cookedResponse)
// Build up a JSON representation of your `amplifyconfiguration.json`
// But replace the endpoint URL with mock web server's.
val json = JSONObject()
.put(...)
// Find correct field to populate by
// viewing structure of amplifyconfiguration.json
.put("Endpoint", fakeCognitoEndpointUrl)
val config = AmplifyConfiguration.fromJson(json)
Amplify.addPlugin(AWSCognitoAuthPlugin())
Amplfiy.configure(config, context)
val yourClass = YouClass(auth = Amplify.Auth)
在第二个示例中留下了一些未指定的细节,但希望这足以让您朝着工作方向前进。