我可以只使用powermock+mockito+junit来模拟一些静态方法吗



我正在使用Junit+Mockito+Powermock编写一个测试。

我有一个类,我想测试如下:

public class MyUtils {
public static Object method1() {} //I want to mock this only
public static void method2() {}   //I want to keep this as is during my test.
public static void method3() {}   //I want to keep this as is during my test.
}

我只想模拟method1,而不是method2method3

@RunWith(PowerMockRunner.class)
@PrepareForTest(MyUtils.class)
public class MyTest {
@Before
public void setUpBeforeClass() throws Exception {
PowerMockito.mockStatic(MyUtils.class);
}
@Test
public void test1() throws Exception {
when(MyUtils.method1()).thenReturn(something);
MyUtils.method3(); //method3 is getting mocked with an empty implementation by PowerMockito
}
...
}

我可以让一些方法被嘲笑吗?也可以让一些不被嘲笑,即它们在测试期间保持原始实现?Mockito+Powermock可以做到这一点吗?

我的测试可能看起来不太优雅,但在发布到这里之前,我已经简化了我的用例。

谢谢。

是的,可以使用Powermock和JUnit模拟静态方法,如下所示:

import static org.junit.Assert.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;    
import static org.powermock.api.mockito.PowerMockito.*;
@RunWith(PowerMockRunner.class)
@PrepareForTest(IDGenerator.class)
public class UserDAOTest {
@Test
public void createShouldReturnAUserId() {
UserDAO dao = new UserDAO();
mockStatic(IDGenerator.class);
when(IDGenerator.generateID()).thenReturn(1);
int result = dao.create(new User());
assertEquals(1, result);
verifyStatic();
}
}

public final class IDGenerator {
static int i;
public static final int generateID() {
return i++;
}
}

public class UserDAO {
public int create(User user){
int id = IDGenerator.generateID();
//Save the user object to the db
return id;
}
}

public class User {
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}

希望它能有所帮助!

如果你想在实际实现中保留的方法比需要模拟的方法多得多(尤其是在你的情况下只有一个),那么我会选择spy而不是mock:

import static org.powermock.api.mockito.PowerMockito.spy;
@RunWith(PowerMockRunner.class)
@PrepareForTest(MyUtils.class)
public class MyTest {
@Before
public void setUpBeforeClass() throws Exception {
spy(MyUtils.class);
}
@Test
public void test1() throws Exception {
doReturn(something).when(MyUtils.class, "method1");
MyUtils.method3(); // this will be a real call
}
...
}

现在,除了method1之外的所有方法都将通过实际实现进行调用。

相关内容

  • 没有找到相关文章

最新更新