Alex Luya
Alex Luya

Reputation: 9922

How to test logic in constructor?

My test class like this:

 public class HandlerTest extends Specification {
   Handler hander
   EventBus eventBus=Mock()     

    def setup(){
        handler=new Handler(eventBus)
    }

    def "constructor"(){
       //How to verify two events do get added to eventBus?
    }

 }

and Constructor of Handler(it is a java class)

    public Handler(EventBus eventBus)
    {
        eventBus.add(FetchSearchWordsEvent.TYPE, this);
        eventBus.add(SetSearchBoxTextEvent.TYPE, this);
    }

Question is:

 how to verify that two events do get registered?

Upvotes: 0

Views: 333

Answers (2)

dafunker
dafunker

Reputation: 519

I would move the call to Handler constructor into the test itself given that it is the function under test.

Try the following:

 public class HandlerTest extends Specification {
   Handler hander
   def mockEventBus = Mock(EventBus)

    def "constructor"(){
       when:
       new Handler(mockEventBus)

       then:
       1 * mockEventBus.add(FetchSearchWordsEvent.TYPE, _ as Handler)
       1 * mockEventBus.add(SetSearchBoxTextEvent.TYPE, _ as Handler)
    }
 }

The functionality of EventBus.add() should be tested separately.

Upvotes: 3

Peter Niederwieser
Peter Niederwieser

Reputation: 123940

It depends on how registerHandler is implemented, and what exactly you want to verify. If the goal is to verify that the constructor ultimately calls some methods on eventBus, you can just use regular mocking. If the goal is to verify that the constructor calls registerHandler on itself, you can use partial mocking using Spy(), as explained in the Spock reference documentation.

PS: Note that partial mocking is considered a smell. Often it's better to change the class under test to make it easier to test. For example, you could add a method that allows to query which handlers have been registered. Then you won't need mocking at all.

Upvotes: 2

Related Questions