如何使用Mockito和Junit模拟静态方法中存在的void方法调用?

时间:2018-09-05 08:26:54

标签: java junit mockito

我有TestME类,它具有静态main方法。我需要避免调用b.cool方法。

public class TestME {
    public static int testme(String ...strings){
        System.out.println(strings.length);
        B b = new B();
        b.cool();
        return strings.length;
    }
}

我的B班以下

public class B {
   public void cool(){
      System.out.println("I am cool");
   }
}

我上面的TestMe类的Junit类在下面

@RunWith(MockitoJUnitRunner.class)
public class JunitTest {

    @Spy
    B b;

    @InjectMocks
    TestME test;

    @Before
    public void setUp(){
        test = new TestME();
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testMe(){
        doNothing().when(b).cool();
        Assert.assertEquals(2, test.testme("xyz", "omg"));
    }
}

2 个答案:

答案 0 :(得分:0)

在调用静态方法时,无需模拟TestMe。像下面的TestMe.testme这样的简单调用。

@Test
    public void testMe(){
        doNothing().when(b).cool();
        Assert.assertEquals(2, TestMe.testme("xyz", "omg"));
    }

答案 1 :(得分:0)

您可以从以下位置更改代码

public class TestME {
    public static int testme(String ...strings){
        System.out.println(strings.length);
        B b = new B();
        b.cool();
        return strings.length;
    }
}

到以下内容:

public class TestME {
    public static int testme(String ...strings){
        System.out.println(strings.length);
        B b = getInstanceOfB();
        b.cool();
        return strings.length;
    }

    static B getInstanceOfB(){
        return new B();
    }
}

然后,您可以在测试代码中监视存根getInstanceOfB()方法的类以返回模拟对象。拥有真正的b.cool永远不会在测试中被调用。

@RunWith(PowerMockRunner.class)
@PrepareForTest(TestME.class)
public class JunitTest {

    @Before
    public void setUp(){
        B b = PowerMockito.mock(B.class);
        PowerMockito.spy(TestME.class);
        PowerMockito.when(TestME.getInstanceOfB()).thenReturn(b);
    }

   @Test
    public void testMe(){
        Assert.assertEquals(2, TestME.testme("xyz", "omg"));
    }
}

您需要PowerMockito来实现。