简体   繁体   English

如何使用 Mockito 模拟 PreparedStatement

[英]How to mock PreparedStatement using Mockito

I have the following function which changes the username of a user in a MySQL database:我有以下 function 更改 MySQL 数据库中用户的用户名:

public User changeUsername (ChangeUsername ChangeUsername) {
    // Getting user from database
    String sql = "select * from users where username='" + ChangeUsername.getUsername() + "'";
    List<User> users = jdbcTemplate.query(sql, new UserMapper());
    User user = users.get(0);
    // Getting encoded password from database
    String encodedPassword = user.getPassword();
    // Getting password input from user
    String rawPassword = ChangeUsername.getPassword();
    // Comparing passwords
    boolean isPasswordMatch = passwordEncoder.matches(rawPassword, encodedPassword);
    // If password matches
    if(isPasswordMatch){
        // Getting current userrname
        String username = ChangeUsername.getUsername();
        // Getting new username
        String newusername = ChangeUsername.getNewusername();
        // Updating username in database with prepared statement
        String update = "update users set username = ? where username = ?";
        Connection conn;
        try {
            conn = datasource.getConnection();
            PreparedStatement preparedStatement = conn.prepareStatement(update);
            preparedStatement.setString(1, newusername );
            preparedStatement.setString(2, username);
            preparedStatement.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return user;
    }
    return null;
   }

I am trying to test the function using Mockito and JUnit 5 however I am getting an assertion error when calling assertEquals to check if the username is being changed successfully in the test code.我正在尝试使用 Mockito 和 JUnit 5 测试 function 5 但是我在成功调用assertEquals以检查用户名代码是否被更改时遇到断言错误。 Therefore the username is not being changed correctly when testing the function.因此,在测试 function 时,用户名没有正确更改。 Below is my test code:下面是我的测试代码:

@RunWith(MockitoJUnitRunner.class)
public class ChangeUsernameTest {

    UserDaoImpl userdaoimpl = mock(UserDaoImpl.class);
    UserDao userdao = mock(UserDao.class);
    @Mock
    JdbcTemplate jdbcTemplate;
    @Mock
    private PreparedStatement stmt;
    @Mock
    private Connection c;
    @Mock
    private DataSource ds;
    @Mock
    ChangeUsername changeusername;
    @Mock
    User user;
    @BeforeEach
    public void setUp() {
      MockitoAnnotations.initMocks(this);
      user = new User();
      changeusername = new ChangeUsername();
      try {
            when(c.prepareStatement(any(String.class))).thenReturn(stmt);
            when(ds.getConnection()).thenReturn(c);
            doNothing().when(stmt).setString(any(int.class), any(String.class));
            when(stmt.execute()).thenReturn(Boolean.TRUE);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    @Test
    public void setUserDetails() {
        user.setAddress("A");
        user.setEmail("B");
        user.setFirstname("C");
        user.setLastname("D");
        user.setPassword("E");
        user.setUsername("F");
    }
    @Test
    public void testSetUsername() {
        changeusername.setUsername("F");
        assertEquals(changeusername.getUsername(), "F");
    }
    @Test
    public void testSetPassword() {
        changeusername.setUsername("E");
        assertEquals(changeusername.getUsername(), "E");
    }
    @Test
    public void testSetNewUsername() {
        changeusername.setNewusername("X");
        assertEquals(changeusername.getNewusername(), "X");
    }
    @Test
    public void testChangeUsername() {
        int update = jdbcTemplate.update(any(String.class), any(Object.class));
        when(userdaoimpl.register(user)).thenReturn(update);
        userdaoimpl.register(user);
        when(userdaoimpl.changeUsername(changeusername)).thenReturn(user);
        userdaoimpl.changeUsername(changeusername);
        assertEquals("X", user.getUsername());
    }
}
//USE PowerMockito it is easy as shown below




@RunWith(PowerMockRunner.class)
@PrepareForTest({yourtarget.class,datasource.class})
public class DBTest {


    @Mock
    private Connection con;

    @Mock
    private PreparedStatement stmt;

    @Mock
    private ResultSet rs;


    @Before
    public void setUpBeforeClass() throws Exception {
        MockitoAnnotations.initMocks(this);

    }

    @Test
    public void testMethod() throws SQLException {
        PowerMockito.mockStatic( DataSource.class );
        try {
            when( DataSource.getConnection() ).thenReturn( con );
        } catch (Exception e) {
            e.printStackTrace();
        }
        when( con.prepareStatement( any()) ).thenReturn( stmt );
        when( stmt.executeUpdate() ).thenReturn( 1 );

    }

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM