JHipsterでのunit testでいくつかハマったのでメモ。
unit test実行は
gradle test
単一test classを指定するには
gradle test --tests FQDN.class.name
test 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: DEBUG
test 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)