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

时间:2018-12-27 04:56:36

标签: java junit mockito

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

}

1 个答案:

答案 0 :(得分:0)

这里要写两种情况。

  1. CreateUserDetails返回“用户创建”
  2. 否则返回“用户ID已经存在”(我修复了两个错字)

如评论中所述,您应该真正抽象DAO层。但是,从高层次上讲,您想模拟DatabaseConnection并为其返回的任何内容返回模拟。这样做可以防止在调用代码库时出现NPE。

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

最后,您不应测试您的代码已创建数据库表并正确填充了它们。只要您要传递的数据(可以测试的数据),就应该相信SQL将按预期执行脚本。如果您确实想发疯,则可以进行一些模拟以确保statement的准备正确。海事组织这太过分了。

祝你好运!