首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在单元测试中传递给控制器时,FakeRequest似乎为空

在单元测试中传递给控制器时,FakeRequest似乎为空
EN

Stack Overflow用户
提问于 2018-06-08 21:44:00
回答 1查看 230关注 0票数 1

在对控制器进行单元测试时出现Null Pointer错误。这个问题似乎已成定局

代码语言:javascript
复制
def signupUser = Action.async{
    implicit request => { //requeust seem to be null

我怀疑是这样的,因为之前测试的堆栈跟踪指向隐式请求行。但我不知道这会有什么问题,因为我像val request = FakeRequest("POST", "/ws/users/signup").withJsonBody(Json.parse("""{"bad": "field"}"""))一样使用FakeRequest

下面是我想要进行单元测试的控制器的一个片段

代码语言:javascript
复制
  class UserController @Inject()(userRepo: UsersRepository,cc: ControllerComponents, silhouette: Silhouette[JWTEnv])(implicit exec: ExecutionContext) extends AbstractController(cc){ 

def signupUser = Action.async{
    implicit request => {...}
 }

我只想测试控制器在收到没有json主体的请求时是否返回错误。因此,我不需要Silhouette,我想模拟它。但是我得到了空指针错误。

下面是我编写单元测试用例的方式

代码语言:javascript
复制
class UserControllerUnitSpec extends PlaySpec with MockitoSugar {

  "User signup request with non-JSON body" should {

    "return  400 (Bad Request) and the validation text 'Incorrect body type. Body type must be JSON'" in {

      val email = "d@d.com"
      val loginInfo = LoginInfo(CredentialsProvider.ID, email);
      val passwordInfo = PasswordInfo("someHasher","somePassword",Some("someSalt"))
      val internalUserProfile = InternalUserProfile(loginInfo,true,Some(passwordInfo))
      val externalUserProfile = ExternalUserProfile(email,"d","d",Some("somePassword"))
      val userProfile = UserProfile(Some(internalUserProfile),externalUserProfile)
      val user = User(UUID.randomUUID(),userProfile)

      println("testing with mocked User value",user);

      val mockUserRepository = mock[UsersRepository]
      when(mockUserRepository.findUser(loginInfo)).thenReturn(Future(Some(user)))
      when(mockUserRepository.saveUser(user)).thenReturn(Future(Some(user)))

      val mockSilhouette = mock[Silhouette[JWTEnv]] //I am probably not doing this correctly
      val mockControllerComponents = mock[ControllerComponents] //I am not sure if this is correct either
      val controller = new UserController(mockUserRepository,mockControllerComponents,mockSilhouette)

      val result:Future[Result] = controller.signupUser(FakeRequest())
      (result.map(response => {
        println("response: ",response)
        response mustBe BadRequest
      }))
    }
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-09 05:15:25

关于模拟,可以使用Helpers.stubControllerComponents而不是mockControllerComponents

代码语言:javascript
复制
val mockControllerComponents = Helpers.stubControllerComponents()

关于mockSilhouette,您必须使用when(...).thenReturn(...)设置模拟,就像您对mockUserRepository所做的那样,即在signupUser中检查silhouette的所有用法,并提供适当的方法存根:

代码语言:javascript
复制
val mockSilhouette = mock[Silhouette[JWTEnv]]
when(mockSilhouette.foo(...)).thenReturn(...)
when(mockUserRepository.bar(...)).thenReturn(...)
...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50762033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档