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



我有类TestME,它有静态主方法。我需要避免调用 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");
}
}

我的 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"));
}
}

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

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来完成它。

由于您调用静态方法,因此无需模拟TestMe。简单的调用,如TestMe.testme,如下所示。

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

最新更新