在对控制器进行单元测试时出现Null Pointer
错误。这个问题似乎已成定局
def signupUser = Action.async{
implicit request => { //requeust seem to be null
我怀疑是这样的,因为之前测试的堆栈跟踪指向隐式请求行。但我不知道这会有什么问题,因为我像val request = FakeRequest("POST", "/ws/users/signup").withJsonBody(Json.parse("""{"bad": "field"}"""))
一样使用FakeRequest
下面是我想要进行单元测试的控制器的一个片段
class UserController @Inject()(userRepo: UsersRepository,cc: ControllerComponents, silhouette: Silhouette[JWTEnv])(implicit exec: ExecutionContext) extends AbstractController(cc){
def signupUser = Action.async{
implicit request => {...}
}
我只想测试控制器在收到没有json
主体的请求时是否返回错误。因此,我不需要Silhouette
,我想模拟它。但是我得到了空指针错误。
下面是我编写单元测试用例的方式
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
}))
}
}
}
发布于 2018-06-09 05:15:25
关于模拟,可以使用Helpers.stubControllerComponents
而不是mockControllerComponents
:
val mockControllerComponents = Helpers.stubControllerComponents()
关于mockSilhouette
,您必须使用when(...).thenReturn(...)
设置模拟,就像您对mockUserRepository
所做的那样,即在signupUser
中检查silhouette
的所有用法,并提供适当的方法存根:
val mockSilhouette = mock[Silhouette[JWTEnv]]
when(mockSilhouette.foo(...)).thenReturn(...)
when(mockUserRepository.bar(...)).thenReturn(...)
...
https://stackoverflow.com/questions/50762033
复制相似问题