TDD和BDD与适用于Android的mockk
我试图在开发带有用例和存储库的干净架构的Android应用程序时,区分TDD和BDD 我已经用登录测试和JUnit5和Mock编写了一个简单的测试。我创建的登录状态是TDD和BDD与适用于Android的mockk,android,unit-testing,tdd,bdd,clean-architecture,Android,Unit Testing,Tdd,Bdd,Clean Architecture,我试图在开发带有用例和存储库的干净架构的Android应用程序时,区分TDD和BDD 我已经用登录测试和JUnit5和Mock编写了一个简单的测试。我创建的登录状态是 enum class LoginState { SUCCESS, EMPTY_FIELD_ERROR, CREDENTIALS_ERROR } 并且有一个UseCase具体类,它有一个模拟本地或远程存储库的接口 private val loginRepository:loginRepository=moc
enum class LoginState {
SUCCESS,
EMPTY_FIELD_ERROR,
CREDENTIALS_ERROR
}
并且有一个UseCase具体类,它有一个模拟本地或远程存储库的接口
private val loginRepository:loginRepository=mockk()
测试呢
/**
* Scenario: Login check with empty fields:
* * Given I am on the login page
* * When I enter empty username
* And I enter empty password
* And I click on the "Login" button
* * Then I get empty fields error.
*/
@Test
fun `Empty fields result empty fields error`() {
// Given
every { loginRepository.login(any(), any()) } returns LoginState.CREDENTIALS_ERROR
// When
val expected = loginUseCase.login("", "")
// Then
verify(exactly = 0) { loginRepository.login(any(), any()) }
assertEquals(expected, LoginState.EMPTY_FIELD_ERROR)
}
/**
* Scenario: Login check with valid length username:
* * Given I am on the login page
* * When I enter valid username
* And I enter any password
* And I click on the "Login" button
* * Then I get ???
*/
@ParameterizedTest
@ValueSource(strings = ["abcdef", "abcdefgh", "abcabcabcd"])
fun `User name should have between 6 and 10 characters`(userName: String) {
// Given
val slot = slot<String>()
every {
loginRepository.login(
capture(slot),
any()
)
} returns (LoginState.CREDENTIALS_ERROR)
// When
val expected = loginUseCase.login(userName, "abcdefg")
// Then
verify(exactly = 1) { loginRepository.login(slot.captured, any()) }
assertEquals(expected, LoginState.CREDENTIALS_ERROR)
assertTrue(slot.captured.length in 6..10)
confirmVerified(loginRepository)
}
/**
*场景:使用有效长度用户名进行登录检查:
**如果我在登录页面上
**当我输入有效用户名时
*我输入任何密码
*我点击“登录”按钮
**然后我得到了???
*/
@参数化测试
@ValueSource(字符串=[“abcdef”、“abcdefgh”、“ABCABCD”])
fun`用户名应包含6到10个字符'(用户名:字符串){
//给定
val插槽=插槽()
每一个{
loginRepository.login(
捕获(插槽),
任何()
)
}返回(LoginState.CREDENTIALS\u错误)
//什么时候
val expected=loginUseCase.login(用户名“abcdefg”)
//然后
验证(正好=1){loginRepository.login(slot.captured,any())}
assertEquals(应为LoginState.CREDENTIALS\u错误)
assertTrue(插槽长度为6..10)
确认已验证(登录回复)
}
我想,你想做的是把两种不同的东西混合在一起,它们应该分开。您应该有一个用于编写单元测试(TDD)的项目(dll),用于验证类和方法。和另一个用于自动化场景(BDD)的项目(dll),用于验证应用程序的总体行为或多个服务之间的行为。@StefanZivkovic,我正在尝试了解TDD和BDD是如何相互关联的。不应该在单元测试中进行验证以确认调用了注入接口的方法吗?这里有一些文章可以帮助您更好地理解模拟。我知道你问过TDD和BDD之间的区别,但听起来这些文章仍然可以给你一些很好的见解。
/**
* Scenario: Login check with valid length username:
* * Given I am on the login page
* * When I enter valid username
* And I enter any password
* And I click on the "Login" button
* * Then I get ???
*/
@ParameterizedTest
@ValueSource(strings = ["abcdef", "abcdefgh", "abcabcabcd"])
fun `User name should have between 6 and 10 characters`(userName: String) {
// Given
val slot = slot<String>()
every {
loginRepository.login(
capture(slot),
any()
)
} returns (LoginState.CREDENTIALS_ERROR)
// When
val expected = loginUseCase.login(userName, "abcdefg")
// Then
verify(exactly = 1) { loginRepository.login(slot.captured, any()) }
assertEquals(expected, LoginState.CREDENTIALS_ERROR)
assertTrue(slot.captured.length in 6..10)
confirmVerified(loginRepository)
}