java - 另一个类的 Mockito 对象方法

标签 java unit-testing junit mockito powermock

您好,我请求您帮助了解如何模拟 Validator.validateConnection(); 类的方法。 问题是类 Class_Implementation 中不存在方法 validateConnection,并且我不想在类 Class_Implementation 中创建该方法。 validateConnection 方法与数据库建立连接以了解连接是否处于 Activity 状态。当 Mockito 运行时,我得到一个由 NamingException 引起的 java.Lang.NullPointerException - 需要在环境中指定类名。

真正的问题是当我调用 Mockito 测试线路时:

Boolean resp = mockImpl.checkConnection();

..在checkConnection()中,类Validator.validateConnection();正在尝试连接到数据库。我只想模拟这一行并返回 truefalse,但问题是方法 validateConnection() 是类 的实例> validator

如果需要更多信息来解决此问题,请告诉我。

public class Class_Implementation {

    public boolean  checkConnection() {
        boolean isConnectionAlive = false;

        Validator.validateConnection();

        // another things for do

        return false;
    }

}

public class Validator {

    public static Boolean validateConnection() {
        Connection conn = new Connection();

        Boolean connectionAlive = false;
        connectionAlive = conn.isConnectionAlive();

        if (connectionAlive) {
            return true;
        } else {
            return false;
        }
    }

}

public class Connection {

    public boolean isConnectionAlive() {
        // Code for connection to DB
    }

}

// class for do the test
@RunWith(PowerMockRunner.class)
@PrepareForTest({Class_Implementation.class,Validator.class}) 
public class TestConnection {

    @Test
    public void validate_Connection() throws Exception {
        Class_Implementation mockImpl = PowerMock.createPartialMock(Class_Implementation.class);

        PowerMock.mockStatic(Validator.class);

        PowerMockito.when(mockImpl,  Validator.validateConnection() ).thenReturn(true);

        PowerMock.replayAll(mockImpl);

        Boolean resp = mockImpl.checkConnection();

        PowerMock.verifyAll();

        Validate.notNull(resp);
    }

}

最佳答案

使用 Validator 对象而不是其静态方法,并将 Validator 注入(inject) Class_Implementation (通过构造函数)。这称为Dependency Injection 。在您的测试中,您可以注入(inject) validator 的模拟。

public class Validator {
  public boolean validateConnection() {
    ...
  }
}

public class Class_Implementation {
  private final Validator validator;

  public Class_Implementation(Validator validator) {
    this.validator = validator;
  }

  public boolean checkConnection() {
    ...
    validator.validateConnection();
    ...
  }
}

public public class Class_ImplementationTest {

  @Test
  public void validate_Connection() throws Exception {
    Validator validator = Mockito.mock(Validator.class);
    Mockito.when(validator.validateConnection()).thenReturn(true);

    Class_Implementation impl = new Class_Implementation(validator);
    boolean response = mockImpl.checkConnection();

    Assert.assertTrue(response);
  }
}

我对您的代码做了一些额外的更改。

  1. 如果只有两种状态,则不要返回 boolean 对象。
  2. 单元测试对类进行测试,其命名类似于带有附加 Test 前缀的类。
  3. 如果您有好的代码,则不需要 PowerMock。

关于java - 另一个类的 Mockito 对象方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27709160/

相关文章:

javascript - 如何使用 Mocha、Grunt 测试 NodeJS 应用程序?

c++ - 关于单元测试(googletest)和项目/文件夹/文件的混淆

java - 如何在 Java 中以编程方式使用 unix 命令来删除生成的目录

java - 在同一对象中使用其他方法的 JUnit 测试方法

java - 加载设置 - 最佳实践

java - 在 AsyncTask 中找不到ViewById

java - 模拟颜色透明度

java - jboss 7.0.1 hibernate javax.persistence.PersistenceException : No Persistence provider for EntityManager

javascript - 编写 "unit testable"jQuery 代码?

java - Camel junit 使用bean组件测试http组件