javajmockit

How to mock only one static method and test the other


@Mocked Provider provider;

public static class Provider {
    public static List<Integer> getStaticList() {
        return new ArrayList<>();
    }

    public static List<Integer> test() {
        return getStaticList();
    }
}

@Test
public void testStatic() {
    ArrayList<Object> list = new ArrayList<>();
    list.add(1);

    new Expectations() {
        {
            Provider.getStaticList();
            result = list;
        }
    };

    assertThat(Provider.test(), JUnitMatchers.hasItem(1));
}

I want to mock (with JMockit) one static method that is called within another one. How can I do that? The above test fails. The real Provider.test method is never called.


Solution

  • You can use partial mocking:

    @Test
    public void testStatic() {
        new Expectations(Provider.class) {{ Provider.getStaticList(); result = 1; }};
    
        List<Integer> test = Provider.test();
    
        assertTrue(test.contains(1));
    }
    

    (With no "@Mocked Provider" field for the test above.)