如何只模拟一个静态方法并测试另一个

时间:2015-12-08 16:18:53

标签: java jmockit

@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));
}

我想模拟(使用JMockit)一个在另一个中调用的静态方法。我怎样才能做到这一点?上述测试失败。永远不会调用真正的Provider.test方法。

3 个答案:

答案 0 :(得分:7)

以下代码仅更改testMethod静态方法的行为,而不会影响其他静态方法。

import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;

import java.util.HashMap;
import java.util.Map;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest({Foo.class })
public class Snipets {

    @Test
    public void hoge() throws Exception {

        PowerMockito.spy(Foo.class);
        PowerMockito.when(Foo.class, "testMethod").thenReturn("dummy");

        String actual = Foo.testMethod();
        assertEquals("dummy", actual);
    }

}

Foo.java

public class Foo {
    public static String testMethod() {
        return "foo";
    }
}

来源:https://gist.github.com/mid0111/8859159

答案 1 :(得分:2)

我使用了一种非常简单的方法来编写条件答案,如下所示:

    PowerMockito.mockStatic(<MyMockedClass>.class, invocation -> {
        if (invocation.getMethod().getName().equals("<methodToMockName>")) {
            return <mockedValue>;
        }
        return invocation.callRealMethod();
    });

答案 2 :(得分:1)

您可以使用部分模拟:

@Test
public void testStatic() {
    new Expectations(Provider.class) {{ Provider.getStaticList(); result = 1; }};

    List<Integer> test = Provider.test();

    assertTrue(test.contains(1));
}

(上面的测试没有&#34; @Mocked Provider&#34;字段。)