繁体   English   中英

Mockito不是在嘲笑对象,而是在对象内部调用方法

[英]Mockito is not mocking the object instead its calling the method inside the object

我正在研究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。 我该如何解决? 下面是我的usercreationclass。

 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()返回的任何连接。

您应该考虑重构您的方法,以便通过依赖项注入而不是静态访问器来提供连接。 然后您的测试可以注入模拟而不是真实的连接。

您不能使用Mockito模拟静态方法,应该在Mockito之上使用PowerMockito'PowerMockito.mockStatic模拟静态方法。

您应该对类依赖项使用参数化的构造函数。 这将适用于Spring或任何POJO。 使用此方法,您可以轻松模拟测试类中的依赖项。

public class ParentClass{

private DBConnection dbcon;
 public ParentClass(DBConnection dbcon){
  this.dbcon = dbcon;
 }
 public String CreateUserDetails(){...} // get rid of dbcon = DatabaseConnection.getInstance();
}

如果您使用的是Spring,这是一个有用的读物​​: https : //www.baeldung.com/constructor-injection-in-spring

在属性vs构造函数上的Spring @Autowire

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM