我正在设置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;
}
我必须为上面的代码编写一个测试用例,我已经尝试过休闲代码。我正在尝试模拟我要从另一个类使用的所有对象,预期结果应该是返回“用户创建”的字符串。但我无法根据当前代码获得预期结果。
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");
}
}
答案 0 :(得分:0)
这里要写两种情况。
如评论中所述,您应该真正抽象DAO层。但是,从高层次上讲,您想模拟DatabaseConnection并为其返回的任何内容返回模拟。这样做可以防止在调用代码库时出现NPE。
一旦模拟就位,测试应返回“用户创建”。对于第二个测试,让您的模拟抛出一个SQLException,然后您可以测试是否返回了“用户ID已存在”。我可能只是将iteratinDetails
作为参数传递,似乎是此方法的依赖项。
最后,您不应测试您的代码已创建数据库表并正确填充了它们。只要您要传递的数据(可以测试的数据),就应该相信SQL将按预期执行脚本。如果您确实想发疯,则可以进行一些模拟以确保statement
的准备正确。海事组织这太过分了。
祝你好运!