org.gradle.testfixtures.ProjectBuilder, org.gradle.api.Project & logging


(Stefan Krawczyk) #1

Hi,

I’m a n00bie to Groovy and I am writing some unit tests using the spock framework, and am using the

ProjectBuilder.builder().build()

to create a Project object.

i.e.

Project project = ProjectBuilder.builder().build()

The code that I am testing uses the Project object’s logger to log information. I would like to be able to set a logger in the Project object so that in my unit test I can also capture logging from the method itself to help debug test failures for example.

e.g. capture the following debug statement XYZ when I test that method:

public Object myMethodThatIAMTesting(Project project, ...)
 {
   ...
   project.logger.debug("XYZ")
   ...
 }

Doing project.setProperty(‘logger’, Object) says I can’t set a read only value… and I can’t figure out what Object to put to satisfy doing project.getLogging().addStandardOutputListener( ??? )

So how do I do this? I can’t seem to figure it out :frowning:

Cheers,

Stefan


(Szczepan Faber) #2

Hey,

Take a look project.getLogging(): http://gradle.org/current/docs/dsl/org.gradle.api.Project.html#org.gradle.api.Project:logging

If that doesn’t help let us know, there should be a way of doing that using slf4j api I think.


(Stefan Krawczyk) #3

No cigar :frowning:

http://www.massapi.com/source/gradle-0.9-rc-3/subprojects/gradle-core/src/main/groovy/org/gradle/testfixtures/ProjectBuilder.java.html If the source code is still like that then it creates a NoOpLoggingManager which has empty methods… and when I try to stick other objects in, the stack trace does indeed say that a NoOpLoggingManager is being used :frowning:

and I see no API to enable me to set the logger in the ProjectBuilder class.

The simpler solution is to explicitly pass in a logger I guess… oh well.


(Szczepan Faber) #4

The simpler solution is to explicitly pass in a logger I guess… oh well.

There you go :slight_smile: A bit of refactoring and things are getting easier to test.

Sorry, the Project that is built by the ProjectBuilder is not a full blown gradle project but a useful mock for tests.


(Stefan Krawczyk) #5

actually creating a new slf4j logger doesnt do anything since I have dont have access in the test to set the log level? or do I? :confused:


(Stefan Krawczyk) #6

I’m a bit lost as to where I would configure the logger that I explicitly create… :confused:


(Szczepan Faber) #7

Since we’re talking about unit testing, perhaps there is a way to refactor the code a little bit to make it easier to test? Wrap the call in something verifiable or use a mocking framework?


(Stefan Krawczyk) #8

yeah Spock doesnt seem to have anything about logging… :confused: oh well.