如何为创建表和添加值的方法编写测试用例



我正在设置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");
	}
}

这里需要编写两个案例。

  1. CreateUserDetails返回"用户创建">
  2. 否则返回"用户ID已存在"(我修复了两个拼写错误)

正如注释中所述,您应该真正抽象您的DAO层。但在较高级别上,您希望模拟DatabaseConnection,并返回它可能返回的任何内容的模拟。这样做可以在调用代码库时防止NPE。

一旦您的mock就位,测试应该返回"用户创建的"。对于第二个测试,让你的一个mock抛出一个SQLException,你可以测试是否返回了"用户ID已经存在"。我可能只是将iteratinDetails作为参数传递,这似乎是该方法的依赖项。

最后,您不应该测试您的代码是否已经创建了数据库表并正确填充了它们。只要您传递的数据(这是您可以测试的),您就应该相信SQL会按预期执行脚本。如果你真的想疯掉,你可以做一些嘲讽来确保statement准备得当。IMO这太过分了。

祝你好运!

相关内容

  • 没有找到相关文章

最新更新