JHipsterでのunit testでいくつかハマったのでメモ。
unit test実行は
gradle test単一test classを指定するには
gradle test --tests FQDN.class.nametest class内の
log.debug(...)を出力するには、build.gradleにtest.testLogging.showStandardStreams = trueを記述し、またsrc/test/resources/application.ymlに以下を記述(src/main/resources/application-dev.ymlには記述あり)1 2 3 4 5
logging: level: ROOT: DEBUG bz.mydns.walt.canmatch: DEBUG io.github.jhipster: DEBUGtest classにおいてRESTで認証したuserを表したい時には
@WithMockUser(import org.springframework.security.test.context.support.WithMockUser;)testされる側のREST methodでは、
java.security.Principalを勝手に引数に加えることでlogin userを取得出来、それをtestする場合にはtest classのMockMvcでrestUserInfoMockMvc.perform(post("/api/user-infos")...)などとする時にorg.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.userを使って.user("foo")とすると、認証された"foo"というuserでのaccessをmock出来るが、org.springframework.security.core.context.SecurityContextHolder.getContext().getAuthentication()というstatic methodでjava.security.Principalが取れ、それに.getName()で名前を取得可能。その方がspringっぽいのかな。test class側では、認証accessが必要なmethodに上記の@WithMockUserをつければ良い。@WithMockUser(username="foo", password="pw", roles={"USER"})などとすれば色々指定可能だが基本的には不要
参照
- WithMockUser
- Spring Security 使い方メモ テスト(2017-08-02)
- 11. Testing Method Security(Spring公式doc)
- Spring Securityを使っているWebアプリのUnitテスト(2016/11/12)