【问题标题】:Creating mock object for database dependency in JUnit testing在 JUnit 测试中为数据库依赖创建模拟对象
【发布时间】:2015-03-10 12:32:44
【问题描述】:

我创建了一个 JUnit 测试,它使用数据库连接来获取一些数据,然后将结果与某个值进行比较以进行验证。 我知道我可以使用Mock Object 概念来删除测试函数的数据库依赖,但我不知道该怎么做。

这是我的测试类方法-

ValidateTest.java

public void testValidateID() {
    Validate validateFields = new Validate();   
    MyID userID = readXmlAndReturnID("UserID.xml");
    boolean expectedResponse = true;
    boolean actualResponse = validateFields.validateSpecifiedID(myID);
    Assert.assertEquals(expectedResponse, actualResponse);
}

这是我使用数据库的实际类方法 -

验证.java

public boolean validateSpecifiedID(MyID myID){
List<String> incomingList = myID.getuserID();
UserIDProgramHome userIDProgramHome = new UserIDProgramHome();

//this requires postgres database connectivity
idList = userIDProgramHome.findIDsByProgram(myID); 
    if(idList.get(0).equals(incomingList.get(0))){
        return true;
    }
    else{
        return false;
    }
}

【问题讨论】:

  • “我知道我可以使用 Mock Object 概念 [...],但我不知道该怎么做。”然后你首先应该完成一些关于它的教程。在研究了这个有点复杂的领域之后,您会发现您的课程与您的其他课程紧密耦合UserIDProgramHome。这些依赖关系使模拟变得非常困难。最后,您将不得不重新设计您的应用程序。

标签: java junit mocking mockito junit4


【解决方案1】:

您需要一种将模拟对象注入到您的测试类中的方法。您的 validateSpecifiedID() 方法的问题在于它在方法本身内创建了一个 UserIDProgramHome 的实例,当它出现时,这可能是您需要模拟的对象。

一个常见的解决方案是重构您的代码,以便将这些类型的依赖项传递给类的构造函数。然后在您的测试中,您可以改为传递一个模拟对象并验证被测类的行为。

查看您的特定测试,我会考虑模拟两件事:您的 MyID 实例和您传递给新的 Validate 构造函数的 UserIDProgramHome。您在测试中唯一关心的是该方法检查myID.getuserID() 的结果,并根据userIDProgramHome.findIDsByProgram() 的结果返回真或假。

【讨论】:

  • 我是否也可以使用其他方法将idList 对象作为参数传递给validateSpecifiedID 方法,而不是在方法本身中使用它。这样做将使该方法从与数据库相关的东西中解放出来。这样我就可以在我的测试类中简单地调用这个方法而不会出现问题。
【解决方案2】:

确切的解决方案取决于您用于测试的模拟库。使用 JMockit,您可以按如下方式编写测试,而将待测代码保持原样:

@Test
public void testValidateID(@Mocked final UserIDProgramHome home) {
    Validate validateFields = new Validate();   
    MyID userID = readXmlAndReturnID("UserID.xml");
    final String firstIDValue = userID.getUserID().get(0);

    new Expectations() {{
        home.findIDsByProgram((MyID) any); result = firstIDValue;
    }};

    boolean idIsValid = validateFields.validateSpecifiedID(userID);

    assertTrue(idIsValid);
}

也可以使用 Mockito + PowerMock 编写等效的测试。无论哪种情况,都不需要对 Validate 类进行修改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    相关资源
    最近更新 更多