Search code examples
javaunit-testingpropertiesmockingjmockit

Mocking simple property access with JMockIt


I have a simple get-set interface:

public interface Foo {

    void setBaz(String baz);
    String getProcessedBaz();    
}


This interface is a dependency of my actual class under test. I'm trying to mock out Foo to have this effective behavior:

public class MockedFoo implements Foo {

    private String bazField;

    @Override
    public void setBaz(String baz) {
        bazField = baz;
    }

    @Override
    public String getProcessedBaz() {
        return "PROCESSED_" + bazField;
    }
}


So my expected result is:

mockedFoo.setBaz("ABC");
assertEquals("PROCESSED_ABC", mockedFoo.getProcessedBaz());


I was able to capture the method argument using withCapture in a Verification, but how do I set up an Expectation with that same input value? It seems you can do either one or the other.

Is there a way to express this in JMockIt? I'm using the latest version (1.9).


NOTE: I'm aware that I can simply set up a Mockup<Foo> instance and put in all the code above. However, my real code is much more complex and I would prefer not to hand-craft the entire mock class.


Solution

  • NOTE: This was inspired by Varun's answer, but I wanted to avoid using reflection and intermediate classes. Rogério also provided a viable alternative, but it did not fit into the overall structure of my test. Thanks to both!


    Here's how I finally got it working:

    public interface Foo {
        void setBaz(String baz);
        String getProcessedBaz();
    }
    
    @RunWith(JMockit.class)
    public class FooTest {
        @Injectable
        private Foo mockedFoo = null;
    
        @Test
        public void testBaz() { 
            new Expectations() {
                private String bazState; // Variable inside Expectations stores the state between calls
    
                {
                    mockedFoo.setBaz(anyString);
                    result = new Delegate() {
                        void setBaz(String baz) { bazState = baz; }
                    };
    
                    mockedFoo.getProcessedBaz();
                    result = new Delegate() {
                        String getProcessedBaz() { return "PROCESSED_" + bazState; }
                    };
                }
            };
    
            mockedFoo.setBaz("ABC");
            assertEquals("PROCESSED_ABC", mockedFoo.getProcessedBaz());
        }
    }