用Mockito模拟静态方法

用Mockito模拟静态方法

我写了一家工厂来生产java.sql.Connection物体:

public class MySQLDatabaseConnectionFactory implements DatabaseConnectionFactory {

    @Override public Connection getConnection() {
        try {
            return DriverManager.getConnection(...);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }}

我想验证传递给DriverManager.getConnection,但我不知道如何模拟静态方法。我使用JUnit 4和Mockito作为测试用例。有一个好的方法来模拟/验证这个特定的用例吗?


守候你守候我
浏览 2858回答 3
3回答

www说

使用PowerMockito在莫基托顶上。示例代码:@RunWith(PowerMockRunner.class)@PrepareForTest(DriverManager.class)public class Mocker {     @Test     public void shouldVerifyParameters() throws Exception {         //given         PowerMockito.mockStatic(DriverManager.class);         BDDMockito.given(DriverManager.getConnection(...)).willReturn(...);         //when         sut.execute(); // System Under Test (sut)         //then         PowerMockito.verifyStatic();         DriverManager.getConnection(...);     }更多信息:为什么Mockito不模拟静态方法?

慕无忌1623718

避免使用静态方法的典型策略是创建包装对象并使用包装对象。包装器对象成为真正的静态类的外观,您不需要测试这些类。包装器对象可能类似于public class Slf4jMdcWrapper {     public static final Slf4jMdcWrapper SINGLETON = new Slf4jMdcWrapper();     public String myApisToTheSaticMethodsInSlf4jMdcStaticUtilityClass() {         return MDC.getWhateverIWant();     }}最后,测试中的类可以使用这个单例对象,例如,具有一个用于实际使用的默认构造函数:public class SomeClassUnderTest {     final Slf4jMdcWrapper myMockableObject;     /** constructor used by CDI or whatever real life use case */     public myClassUnderTestContructor() {         this.myMockableObject = Slf4jMdcWrapper.SINGLETON;     }     /** constructor used in tests*/     myClassUnderTestContructor(Slf4jMdcWrapper myMock) {         this.myMockableObject = myMock;     }}在这里,您可以很容易地测试一个类,因为您不直接使用带有静态方法的类。如果您使用的是CDI,并且可以使用@Inject注释,那么它就更容易了。只需让包装器bean@ApplicationScoped,将它注入到协作器中(您甚至不需要复杂的构造器进行测试),然后继续进行模拟。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java