当前位置: 首页 > news >正文

网站推广方案范例绵阳市网站建设

网站推广方案范例,绵阳市网站建设,中国制造网外贸平台下载,智能小程序开发者平台好的单元测试应该仅出于一个原因而失败。 这意味着适当的单元测试仅测试一个逻辑概念。 如果我们要编写干净的测试#xff0c;则必须识别这些逻辑概念#xff0c;并且每个逻辑概念仅编写一个测试用例。 这篇博客文章描述了我们如何识别从测试中发现的逻辑概念#xff0c;以… 好的单元测试应该仅出于一个原因而失败。 这意味着适当的单元测试仅测试一个逻辑概念。 如果我们要编写干净的测试则必须识别这些逻辑概念并且每个逻辑概念仅编写一个测试用例。 这篇博客文章描述了我们如何识别从测试中发现的逻辑概念以及如何将现有的单元测试分成多个单元测试。 干净还不够好 让我们先看一下单元测试的源代码该源代码确保当使用唯一的电子邮件地址和社交登录提供者创建新用户帐户时 RepositoryUserService类的registerNewUserAccountRegistrationForm userAccountData方法能够按预期工作。 该单元测试的源代码如下所示 import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.invocation.InvocationOnMock; import org.mockito.runners.MockitoJUnitRunner; import org.mockito.stubbing.Answer; import org.springframework.security.crypto.password.PasswordEncoder;import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.mockito.Matchers.isA; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when;RunWith(MockitoJUnitRunner.class) public class RepositoryUserServiceTest {private static final String REGISTRATION_EMAIL_ADDRESS john.smithgmail.com;private static final String REGISTRATION_FIRST_NAME John;private static final String REGISTRATION_LAST_NAME Smith;private static final SocialMediaService SOCIAL_SIGN_IN_PROVIDER SocialMediaService.TWITTER;private RepositoryUserService registrationService;Mockprivate PasswordEncoder passwordEncoder;Mockprivate UserRepository repository;Beforepublic void setUp() {registrationService new RepositoryUserService(passwordEncoder, repository);}Testpublic void registerNewUserAccount_SocialSignInAndUniqueEmail_ShouldCreateNewUserAccountAndSetSignInProvider() throws DuplicateEmailException {RegistrationForm registration new RegistrationFormBuilder().email(REGISTRATION_EMAIL_ADDRESS).firstName(REGISTRATION_FIRST_NAME).lastName(REGISTRATION_LAST_NAME).isSocialSignInViaSignInProvider(SOCIAL_SIGN_IN_PROVIDER).build();when(repository.findByEmail(REGISTRATION_EMAIL_ADDRESS)).thenReturn(null);when(repository.save(isA(User.class))).thenAnswer(new AnswerUser() {Overridepublic User answer(InvocationOnMock invocation) throws Throwable {Object[] arguments invocation.getArguments();return (User) arguments[0];}});User createdUserAccount registrationService.registerNewUserAccount(registration);assertThat(createdUserAccount).hasEmail(REGISTRATION_EMAIL_ADDRESS).hasFirstName(REGISTRATION_FIRST_NAME).hasLastName(REGISTRATION_LAST_NAME).isRegisteredUser().isRegisteredByUsingSignInProvider(SOCIAL_SIGN_IN_PROVIDER);verify(repository, times(1)).findByEmail(REGISTRATION_EMAIL_ADDRESS);verify(repository, times(1)).save(createdUserAccount);verifyNoMoreInteractions(repository);verifyZeroInteractions(passwordEncoder);} } 这个单元测试非常干净。 毕竟我们的测试类测试方法以及在测试方法内部创建的局部变量具有描述性名称。 我们还用常数替换了幻数并创建了特定领域的语言来创建新对象和编写断言。 但是 我们可以使这项测试更好 。 这个单元测试的问题是它可能由于多种原因而失败。 如果发生以下情况它将失败 我们的服务方法不会检查是否从我们的数据库中找不到输入到注册表中的电子邮件地址。 持久化的User对象的信息与在注册表中输入的信息不匹配。 返回的User对象的信息不正确。 我们的服务方法通过使用PasswordEncoder对象为用户创建密码。 换句话说此单元测试测试了四个不同的逻辑概念这导致以下问题 如果此测试失败我们不一定知道为什么失败。 这意味着我们必须阅读单元测试的源代码。 单元测试有点长这使得阅读起来有些困难。 很难描述预期的行为。 这意味着很难为我们的测试方法找到好名字。 通过确定该单元测试将失败的情况我们可以确定单个单元测试所涵盖的逻辑概念。 这就是为什么我们需要将此测试分为四个单元测试。 一测试一故障 下一步是将单元测试分成四个新的单元测试并确保每个单元测试都测试一个逻辑概念。 我们可以通过编写以下单元测试来做到这一点 我们需要确保我们的服务方法检查用户提供的电子邮件地址是否唯一。 我们需要验证持久性User对象的信息是否正确。 我们需要确保返回的User对象的信息正确。 我们需要验证我们的服务方法没有为使用社交登录提供商的用户创建编码密码。 编写完这些单元测试之后测试类的源代码如下所示 import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.invocation.InvocationOnMock; import org.mockito.runners.MockitoJUnitRunner; import org.mockito.stubbing.Answer; import org.springframework.security.crypto.password.PasswordEncoder;import static net.petrikainulainen.spring.social.signinmvc.user.model.UserAssert.assertThat; import static org.mockito.Matchers.isA; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when;RunWith(MockitoJUnitRunner.class) public class RepositoryUserServiceTest {private static final String REGISTRATION_EMAIL_ADDRESS john.smithgmail.com;private static final String REGISTRATION_FIRST_NAME John;private static final String REGISTRATION_LAST_NAME Smith;private static final SocialMediaService SOCIAL_SIGN_IN_PROVIDER SocialMediaService.TWITTER;private RepositoryUserService registrationService;Mockprivate PasswordEncoder passwordEncoder;Mockprivate UserRepository repository;Beforepublic void setUp() {registrationService new RepositoryUserService(passwordEncoder, repository);}Testpublic void registerNewUserAccount_SocialSignInAndUniqueEmail_ShouldCheckThatEmailIsUnique() throws DuplicateEmailException {RegistrationForm registration new RegistrationFormBuilder().email(REGISTRATION_EMAIL_ADDRESS).firstName(REGISTRATION_FIRST_NAME).lastName(REGISTRATION_LAST_NAME).isSocialSignInViaSignInProvider(SOCIAL_SIGN_IN_PROVIDER).build();when(repository.findByEmail(REGISTRATION_EMAIL_ADDRESS)).thenReturn(null);registrationService.registerNewUserAccount(registration);verify(repository, times(1)).findByEmail(REGISTRATION_EMAIL_ADDRESS);}Testpublic void registerNewUserAccount_SocialSignInAndUniqueEmail_ShouldSaveNewUserAccountAndSetSignInProvider() throws DuplicateEmailException {RegistrationForm registration new RegistrationFormBuilder().email(REGISTRATION_EMAIL_ADDRESS).firstName(REGISTRATION_FIRST_NAME).lastName(REGISTRATION_LAST_NAME).isSocialSignInViaSignInProvider(SOCIAL_SIGN_IN_PROVIDER).build();when(repository.findByEmail(REGISTRATION_EMAIL_ADDRESS)).thenReturn(null);registrationService.registerNewUserAccount(registration);ArgumentCaptorUser userAccountArgument ArgumentCaptor.forClass(User.class);verify(repository, times(1)).save(userAccountArgument.capture());User createdUserAccount userAccountArgument.getValue();assertThat(createdUserAccount).hasEmail(REGISTRATION_EMAIL_ADDRESS).hasFirstName(REGISTRATION_FIRST_NAME).hasLastName(REGISTRATION_LAST_NAME).isRegisteredUser().isRegisteredByUsingSignInProvider(SOCIAL_SIGN_IN_PROVIDER);}Testpublic void registerNewUserAccount_SocialSignInAndUniqueEmail_ShouldReturnCreatedUserAccount() throws DuplicateEmailException {RegistrationForm registration new RegistrationFormBuilder().email(REGISTRATION_EMAIL_ADDRESS).firstName(REGISTRATION_FIRST_NAME).lastName(REGISTRATION_LAST_NAME).isSocialSignInViaSignInProvider(SOCIAL_SIGN_IN_PROVIDER).build();when(repository.findByEmail(REGISTRATION_EMAIL_ADDRESS)).thenReturn(null);when(repository.save(isA(User.class))).thenAnswer(new AnswerUser() {Overridepublic User answer(InvocationOnMock invocation) throws Throwable {Object[] arguments invocation.getArguments();return (User) arguments[0];}});User createdUserAccount registrationService.registerNewUserAccount(registration);assertThat(createdUserAccount).hasEmail(REGISTRATION_EMAIL_ADDRESS).hasFirstName(REGISTRATION_FIRST_NAME).hasLastName(REGISTRATION_LAST_NAME).isRegisteredUser().isRegisteredByUsingSignInProvider(SOCIAL_SIGN_IN_PROVIDER);}Testpublic void registerNewUserAccount_SocialSignInAnUniqueEmail_ShouldNotCreateEncodedPasswordForUser() throws DuplicateEmailException {RegistrationForm registration new RegistrationFormBuilder().email(REGISTRATION_EMAIL_ADDRESS).firstName(REGISTRATION_FIRST_NAME).lastName(REGISTRATION_LAST_NAME).isSocialSignInViaSignInProvider(SOCIAL_SIGN_IN_PROVIDER).build();when(repository.findByEmail(REGISTRATION_EMAIL_ADDRESS)).thenReturn(null);registrationService.registerNewUserAccount(registration);verifyZeroInteractions(passwordEncoder);} } 编写仅测试一个逻辑概念的单元测试的明显好处是很容易知道为什么测试失败。 但是此方法还有其他两个好处 指定期望的行为很容易。 这意味着更容易为我们的测试方法找出好名字。 由于这些单元测试比原始单元测试要短得多因此更容易弄清测试方法/组件的要求。 这有助于我们将测试转换为可执行规范。 让我们继续并总结从这篇博客文章中学到的知识。 摘要 现在我们已经成功地将单元测试分为四个较小的单元测试它们测试了一个逻辑概念。 这篇博客文章教会了我们两件事 我们了解到通过确定测试失败的情况我们可以确定单个单元测试所涵盖的逻辑概念。 我们了解到编写仅测试一个逻辑概念的单元测试有助于我们将测试用例编写成可执行的规范从而确定测试方法/组件的要求。 翻译自: https://www.javacodegeeks.com/2014/06/writing-clean-tests-divide-and-conquer.html
http://www.yutouwan.com/news/22535/

相关文章:

  • 阳谷网站建设网络推广上海搬家公司哪家便宜
  • pc网站开发获取位置河南郑州做网站h汉狮
  • 广州金融网站建设企业网站管理系统 cms
  • 关于网站建设项目创业计划书临邑云速网站建设
  • 小程序做视频网站网站建设基本代码
  • 网站在百度上搜索不到网站的备案要求吗
  • 建设个人购物网站网页制作二维码
  • app营销网站模板网站建设的步骤和要点
  • 开平市网站建设个人注册商标步骤
  • 引擎搜索网站模板巨量关键词搜索查询
  • 网站建设公司的介绍义乌外贸网站建设公司
  • 外贸网站设计师响应式的网站做优化好吗
  • 西安三桥网站建设长春网站排名
  • 杭州市网站seo女生做网站主题有哪些
  • 做网站好的公司西安网站建设推广优化
  • 亚马逊网站建设目的温州建网站业务人员
  • 手机网站建设软件有哪些内容wordpress mu 2017
  • 开发网站开发工程师招聘要求龙岗网红基地
  • 门户网站建设推荐新乡搜索引擎优化
  • 南昌网站建设工作长春seo外包平台
  • 360任意看地图网站网易云音乐网站建设项目规划书
  • 北京建设部网站职称网站分页符素材
  • 花木企业网站源码wordpress中药材主题
  • 高品质网站开发国外的智慧城市建设网站
  • 目前做网站流行的是什么淮安市住房和城乡建设局网站首页
  • 网站搜索查询友博国际个人中心登录
  • 网站超市源码哪个好遵义市做网站的电话
  • 小学学校网站建设情况资料多个域名解析到一个网站
  • 用vs2013做网站登录西安市发布最新消息
  • 公司网站建设管理WordPress企业 破解主题