对外部对象不需要的一些方法进行单元测试。
Unit testing some methods that aren't required by outside objects.
我有我的数据库层:
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 方法是否有错误的用户名密码等。
- 保护这些方法。
- 制作那些方法public。
我假设您的 class 正在使用一些合作者连接到数据库,当您调用 this.openSession()
模拟该合作者并让模拟 return 响应密码错误或密码不足时特权,以便您可以在该场景中测试 class 的行为。例如
class 正在测试
public class DataBaseLayer {
public DataBaseLayer(SomeDBClass dbObject){
this.dbObject = dbObject;
}
...
private void openSession() {
dbObject.connect(username, password);
}
...
public Result runQuery(Query q){
...
}
测试class
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);
}
}
我有我的数据库层:
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 方法是否有错误的用户名密码等。
- 保护这些方法。
- 制作那些方法public。
我假设您的 class 正在使用一些合作者连接到数据库,当您调用 this.openSession()
模拟该合作者并让模拟 return 响应密码错误或密码不足时特权,以便您可以在该场景中测试 class 的行为。例如
class 正在测试
public class DataBaseLayer {
public DataBaseLayer(SomeDBClass dbObject){
this.dbObject = dbObject;
}
...
private void openSession() {
dbObject.connect(username, password);
}
...
public Result runQuery(Query q){
...
}
测试class
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);
}
}