scala - Unit test logger messages using specs2 + scalalogging -
i have little problem here , have no idea how implement unit testing logger messages. of course, sounds little weird, me it's interesting topic. let me more specific.
i have scala class , test specification:
class testable extends logging { def method() = { // method calls logger.info("message1") } } class testablespec extends specification shouldmatchers mockito { "testable instance" should { // important tests "print proper log message during method call" in { // , how test logger prints proper message ("message1")? } } }
my first thought intercept underlying logger engine messages seems little hard thing implement due usage of mixins in testable class, therefore ideas such things helpful.
update: implemented test , decided share solution community. cannot mock scalalogging.logger class directly because it's final still can mock underlying slf4j logger. clarify idea:
class testable extends logging { def foo() = { // ... logger.info("foo has been called") } } // imports omitted. import com.typesafe.scalalogging.slf4j.logger import org.slf4j.{logger => underlying} class testablespec extends specification mockito shouldmatchers { def inittestable(mocked: underlying): testable = { new testable() { override lazy val logger = logger(mocked) } } "testable instance" should { "invoke logger proper message" in { val mocked = mock[underlying] mocked.isinfoenabled returns true // should set true test inittestable(mocked).foo() there one(mocked).info("foo has been called") } } }
thanks eric help. answer key solution.
one possibility use mockito check method calls:
class testable extends logging { def method() = { // method calls logger.info("message1") } } class testablespec extends specification shouldmatchers mockito { "testable instance" should { "print proper log message during method call" in { val mocklogger = mock[logger] val testable = new testable { // switch logger mock instance override val logger = mocklogger } testable.method() there one(mocklogger).info("message1") } } }
this main idea might have adapt depending on exact traits , logging framework:
- logger must overridable
- the info method must not final (one of mockito's limitations)
Comments
Post a Comment