单元测试外部对象不需要的一些方法。

时间:2015-03-25 22:32:42

标签: java unit-testing scope

我有我的数据库层:

public class DataBaseLayer
{
    public Result runQuery(Query q)
    {
        this.openSession(); 
        this.runPackage(q);
        Results r = this.fetchResults();
        this.closeSession();
        return r;
    }

}

目前所有这些方法都是私有方法。

但我希望能够测试它们。

例如

private void testOpenSession_wrongUserNamePassword_returnsBadUserNamePassWordError();
private void testrunPackage_insufficientPrivileges_returnsInsufficientPrivlegesError();

问题是最好的方法是什么?

我想我可以:

  • 只需测试runQuery方法的错误用户名密码等。
  • 使这些方法受到保护。
  • 将这些方法公之于众。

1 个答案:

答案 0 :(得分:1)

我假设您的类正在使用某个协作者连接到数据库时,您调用this.openSession()模拟该协作者并让​​模拟返回错误密码或权限不足所需的响应,以便您可以测试您的类的行为在那种情况下。例如

考试中的课程

public class DataBaseLayer {
    public DataBaseLayer(SomeDBClass dbObject){
        this.dbObject = dbObject;
    }

    ...

    private void openSession() {
        dbObject.connect(username, password);
    }

    ...

    public Result runQuery(Query q){
    ...
}

测试类

public class DataBaseLayerTest {

    @Test(expected = IncorrectPasswordException.class)
    public void testOpenSession_wrongUserNamePassword_returnsBadUserNamePassWordError() {
        SomeDBClass someDBClass = Mockito.mock(SomeDBClass.class)
        Mockito.when(someDBClass.connect(Mockito.anyString(), Mockito.anyString())).throw(new IncorrectPasswordException())

        DataBaseLayer underTest = new DataBaseLayer(someDBClass)

        underTest.runQuery(someQuery);
    }
}