另一个类的Mockito对象方法

时间:2014-12-30 16:39:56

标签: java unit-testing junit mockito powermock

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

真正的问题是当我打电话给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);
    }

}

2 个答案:

答案 0 :(得分:1)

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

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. 如果只有两个状态,则不返回布尔对象。
  2. 单元测试对类进行测试,并且类似于具有附加测试前缀的类。
  3. 如果您的代码很好,则不需要PowerMock。

答案 1 :(得分:0)

只是嘲笑你的Class_Implementation(你应该更改名称并坚持使用Java命名标准)并存根validateConnection()方法:

final Class_Implementation mock = mock(Class_Implementation.class);

when(mock.checkConnection()).thenReturn(true); // or false

但无论如何,你应该模仿的是开始的界面。

相关问题