TM.
TM.

Reputation: 111027

jUnit - How to assert that inherited methods are invoked?

Let's say you have some 3rd-party library class that you want to extend, simply to add convenience methods to it (so you can call an inherited method with default parameters for example).

Using jUnit/jMock, is it possible to write an assertion / mock expection that tests that the correct inherited method is called?

For example, something like this:

class SomeClass extends SomeLibraryClass {
    public String method(String code) {
         return method(code, null, Locale.default());
    }
}

How can I assert that method is being called?

Upvotes: 2

Views: 4278

Answers (4)

krosenvold
krosenvold

Reputation: 77131

You can make a further subclass inside your unit test that actually tells you:

public class MyTest {
    boolean methodCalled = false;

    @Test
    public void testMySubclass(){
          TestSomeClass testSomeClass = new TestSomeClass();
          // Invoke method on testSomeclass ...
          assertTrue( methodCalled);

    }  
    class TestSomeClass extends SomeClass{
        public String method(String code){
              methodCalled = true;
        } 
     }
}

Upvotes: 4

Rogério
Rogério

Reputation: 16380

It may indeed be better to only write integration tests in this case, but if you really want a unit test, you can have it just as easily as in any other case:

public class SomeClassTest
{
    @Test
    public void testMethod()
    {
        final String code = "test";

        new Expectations()
        {
            SomeLibraryClass mock;

            {
                mock.method(code, null, (Locale) any);
            }
        };

        new SomeClass().method(code);
    }
}

This test uses the JMockit mocking API.

Upvotes: 1

Steve Freeman
Steve Freeman

Reputation: 2707

it's hard to tell without a more concrete example, but I'd guess that this ought to be an integration test--test the whole package together--rather than a unit test. Sometimes one can be too fine-grained with unit testing.

Upvotes: 0

Nick Veys
Nick Veys

Reputation: 23939

Unit testing is more useful to verify the functionality of given methods, not to assert coverage. Unit tests that care more about what method got called know way more about the classes they are testing than they probably should, not to mention will be confusing to the reader.

Coverage tools like Cobertura or EMMA will tell you whether you properly covered your code.

Upvotes: 2

Related Questions