我正在设置java项目,用户在其中输入他的详细信息,数据将保存在数据库中。下面是我的代码:
public String CreateUserDetails() throws SQLException, JsonProcessingException
{
iterationResourse = new IterationResourse();
dbcon = DatabaseConnection.getInstance();
iteratinDetails = IterationDetailsParser.getInstance();
try {
String sqlUser = "INSERT INTO user (User_Id,Username,Active_Indi)VALUES(?,?,?)";
PreparedStatement statement = (PreparedStatement) dbcon.con.prepareStatement(sqlUser);
statement.setString(1, iterationResourse.ConvertObjectToString(iteratinDetails.getUserId()));
statement.setString(2, iterationResourse.ConvertObjectToString(iteratinDetails.getUserObj()));
statement.setBoolean(3, true );
statement.executeUpdate();
statement.close();
System.out.println("user created");
st = "user created";
} catch (SQLException e)
{
System.out.println("user id alredy exits");
userIdExits = false;
ObjectMapper mapperUser = new ObjectMapper();
JsonNode rootNode = mapperUser.createObjectNode();
((ObjectNode) rootNode).put("Response", "User ID alreday exits");
String jsonString = mapperUser.writerWithDefaultPrettyPrinter().writeValueAsString(rootNode);
System.out.println(jsonString);
iterationResourse.response = jsonString;
st = "Response", "User ID alreday exits";
}
return st;
}
我必须为上面的代码写一个测试用例,我已经尝试了闲置的代码。我试图模拟我试图从另一个类中使用的所有对象,预期结果应该是返回"User created"的字符串。但我无法根据当前代码获得预期的结果。
public class UserDatabaseTest {
User user = null;
IterationResourse iterationResourse;
DatabaseConnection db;
IterationDetailsParser iterationDetails ;
@Before
public void setUp()
{
iterationResourse = mock(IterationResourse.class);
db = mock(DatabaseConnection.class);
iterationDetails = mock(IterationDetailsParser.class);
user = new User();
}
@Test
public void test() throws JsonProcessingException, SQLException {
Object Object = "3";
String value = "3";
when(db.getInstance().GetDBConnection()).thenReturn(db.getInstance().GetDBConnection());
when(iterationDetails.getUserId()).thenReturn(Object);
when(iterationResourse.ConvertObjectToString(Object)).thenReturn(value);
assertEquals(user.CreateUserDetails(), "user created");
}
}
这里需要编写两个案例。
- CreateUserDetails返回"用户创建">
- 否则返回"用户ID已存在"(我修复了两个拼写错误)
正如注释中所述,您应该真正抽象您的DAO层。但在较高级别上,您希望模拟DatabaseConnection,并返回它可能返回的任何内容的模拟。这样做可以在调用代码库时防止NPE。
一旦您的mock就位,测试应该返回"用户创建的"。对于第二个测试,让你的一个mock抛出一个SQLException,你可以测试是否返回了"用户ID已经存在"。我可能只是将iteratinDetails
作为参数传递,这似乎是该方法的依赖项。
最后,您不应该测试您的代码是否已经创建了数据库表并正确填充了它们。只要您传递的数据(这是您可以测试的),您就应该相信SQL会按预期执行脚本。如果你真的想疯掉,你可以做一些嘲讽来确保statement
准备得当。IMO这太过分了。
祝你好运!