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

Popular posts from this blog

php - Calling a template part from a post -

Firefox SVG shape not printing when it has stroke -

How to mention the localhost in android -