java - Mockito 不是在模拟对象,而是在对象内部调用方法
问题描述
我正在研究 java 项目,其中我有一个名为 user 的类,它将用户的详细信息存储在数据库中。我正在尝试使用测试用例测试此类:当用户成功创建表时,我创建了一个将返回“用户创建”的字符串,我想使用 junit 对其进行测试。下面是我的junit测试代码
public class UserDatabaseTest
{
User user = null;
IterationDetailsParser iterationDetails = mock(IterationDetailsParser.class);
DatabaseConnection dbConnection = mock(DatabaseConnection.class);
Object obj ;
Connection con;
@Before
public void setUp() throws SQLException
{
MockitoAnnotations.initMocks(this);
user = new User();
con = (Connection) dbConnection.GetDBConnection();
obj = iterationDetails.getUserId();
}
@Test
public void test() throws JsonProcessingException, SQLException
{
Mockito.when(dbConnection.GetDBConnection()).thenReturn(con);
Mockito.when(iterationDetails.getUserId()).thenReturn("8");
assertSame("User ID alreday exits", user.CreateUserDetails());
}
}
现在我想模拟我从其他类中使用的对象,例如“iterationDetails.getUserId()”。当我尝试模拟对象而不是被模拟时,它正在调用真正的方法 getuserId() 并返回 null。我该如何解决这个问题?下面是我的用户创建类。
public String CreateUserDetails() throws SQLException, JsonProcessingException
{
dbcon = DatabaseConnection.getInstance();
iteratinDetails = IterationDetailsParser.getInstance();
String st;
try {
String sqlUser = "INSERT INTO user (User_Id,Username,Active_Indi)VALUES(?,?,?)";
PreparedStatement statement = (PreparedStatement) dbcon.GetDBConnection().prepareStatement(sqlUser);
statement.setString(1, iteratinDetails.getUserId());
statement.setString(2, iteratinDetails.getUserObj());
statement.setBoolean(3, true );
statement.executeUpdate();
statement.close();
System.out.println("user created");
// string i return in last compare using assertEquals
st = "user created";
} catch (SQLException e)
{
System.out.println("user id alredy exits");
userIdExits = false;
}
return st;
}
tl;博士
在这种情况下我应该如何模拟对象?
解决方案
dbConnection
您正在嘲笑的内容永远不会传递到您的其他方法中。相反,它使用由 . 返回的任何连接DatabaseConnection.getInstance()
。
您应该考虑重构您的方法,以便通过依赖注入而不是静态访问器提供连接。然后你的测试可以注入模拟而不是真正的连接。
推荐阅读
- java - 开放式跟踪:将多个 TraceId 链接到一个跟踪中
- tfs - 在 TFS 2015 中,标题旁边的彩色框是什么?
- swift - 如何将字典保存到 User/Documents 文件夹中的文件中?
- c# - 使用 EWS 从 Office365 发送电子邮件,地址不存在
- c# - 将回调传递给反射创建的类方法
- python - 嵌套循环——保持迭代次数不变
- javascript - 如何设置 react-leaflet 弹出窗口的样式
- javascript - Chartjs 工具提示锚点在条形图上的位置
- angular - Ag-Grid:无法减少详细信息行的容器空间
- powerbi - Power BI - DAX - YTD 计算的奇怪行为