Mockito не дразнит объект, а вызывает метод внутри объекта - PullRequest
0 голосов
/ 28 декабря 2018

Я работаю над проектом Java, где у меня есть класс с именем user, который хранит информацию о пользователе в базе данных.Я пытаюсь протестировать этот класс с помощью testcase: когда пользователь успешно создает таблицу, я создал строку, которая будет возвращать «пользователь создал», я хочу проверить это с помощью 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 () и возвращает ноль.Как я могу решить это?Ниже мой пользовательский класс.

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; dr

Как мне высмеивать объекты в этом состоянии?

Ответы [ 3 ]

0 голосов
/ 28 декабря 2018

вы не можете смоделировать статические методы, используя Mockito, вы должны использовать PowerMockito'PowerMockito.mockStatic поверх Mockito, чтобы высмеивать статические методы.

0 голосов
/ 28 декабря 2018

Вы должны использовать параметризованный конструктор для зависимостей классов.Это будет работать с пружиной или любым 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

Spring @Autowire в свойствах vs Constructor

0 голосов
/ 28 декабря 2018

dbConnection, над которым вы издеваетесь, никогда не передается вашему другому методу.Вместо этого он использует то, какое соединение возвращает DatabaseConnection.getInstance().

. Вы должны рассмотреть возможность рефакторинга вашего метода, чтобы соединение обеспечивалось внедрением зависимости, а не статическим средством доступа.Тогда ваш тест может внедрить макет, а не реальное соединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...