簡體   English   中英

使用Mockito進行插入方法的單元測試

[英]unit test for insertion method using mockito

我在插入方法的單元測試中遇到問題,盡管我使用了模擬對象,但數據已插入數據庫,請問這是怎么回事?

這是該方法的源代碼

public void InsertPersonalData(PersonalData personaldata) throws SQLException, DAOException, ClassNotFoundException {
        try {
            PreparedStatement psmt = MysqlConnection.getPreparedStatement("INSERT INTO personal_data values(?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
            psmt.setString(1, personaldata.getiD());
            psmt.setString(2, personaldata.getPatientName());
            psmt.setString(3, personaldata.getBirthDate());
            psmt.setString(4, personaldata.getPlaceOfBirth());
            psmt.setString(5, personaldata.getGender());
            psmt.setString(6, personaldata.getNationality());
            psmt.setString(7, personaldata.getCurrentAddress());
            psmt.setString(8, personaldata.getCityAddress());
            psmt.setString(9, personaldata.getMaritalStatus());
            psmt.setString(10, personaldata.getOffspring());
            psmt.setString(11, personaldata.getAgeOfYoungestOffspring());
            psmt.setString(12, personaldata.getWorkNature());
            psmt.setString(13, personaldata.getPhoneNumber());
            psmt.setString(14, personaldata.geteMail());

            psmt.executeUpdate();

        } catch (SQLException e) {
            throw new DAOException(e);

        }

這是我使用嘲笑的方式

@RunWith(MockitoJUnitRunner.class)
public class PersonalDataDaoTest {

    public PersonalData newpd;

    @Mock
    Connection conn;

    @Mock
    PreparedStatement psmt;

    @InjectMocks
    PersonalDataDao newDAO = new PersonalDataDao();

測試代碼:

@Test
    public void HappyTestForInsert() throws SQLException, DAOException, ClassNotFoundException {
        when(conn.prepareStatement(anyString())).thenReturn(psmt);
        //ArgumentCaptor<Integer> intcaptor = ArgumentCaptor.forClass(int.class);
        ArgumentCaptor<String> stringcaptor = ArgumentCaptor.forClass(String.class);
        String id = "11";
        String patientName = "yara";
        String birthDate = "2001-12-5";
        String placeOfBirth = "cairo";
        String gender = "female";
        String nationality = "egyptian";
        String currentAddress = "cairo";
        String cityAddress = "cairo";
        String maritalStatus = "married";
        String offspring = "1";
        String ageOfYoungestOffspring = "2";
        String workNature = "teacher";
        String phoneNumber = "0324324234";
        String eMail = "yara@hotmail.com";

        PersonalData p = new PersonalData(id, patientName, birthDate, placeOfBirth, gender, nationality, currentAddress, cityAddress, maritalStatus, offspring, ageOfYoungestOffspring, workNature, phoneNumber, eMail);
        newDAO.InsertPersonalData(p);
        //verify(psmt, times(1)).setInt(anyInt(), intcaptor.capture());
        verify(psmt, times(14)).setString(anyInt(), stringcaptor.capture());
        Assert.assertTrue(stringcaptor.getAllValues().get(0).equals(id));
        Assert.assertTrue(stringcaptor.getAllValues().get(1).equals(patientName));
        Assert.assertTrue(stringcaptor.getAllValues().get(2).equals(birthDate));
        Assert.assertTrue(stringcaptor.getAllValues().get(3).equals(placeOfBirth));
        Assert.assertTrue(stringcaptor.getAllValues().get(4).equals(gender));
        Assert.assertTrue(stringcaptor.getAllValues().get(5).equals(nationality));
        Assert.assertTrue(stringcaptor.getAllValues().get(6).equals(currentAddress));
        Assert.assertTrue(stringcaptor.getAllValues().get(7).equals(cityAddress));
        Assert.assertTrue(stringcaptor.getAllValues().get(8).equals(maritalStatus));
        Assert.assertTrue(stringcaptor.getAllValues().get(9).equals(offspring));
        Assert.assertTrue(stringcaptor.getAllValues().get(10).equals(ageOfYoungestOffspring));
        Assert.assertTrue(stringcaptor.getAllValues().get(11).equals(workNature));
        Assert.assertTrue(stringcaptor.getAllValues().get(12).equals(phoneNumber));
        Assert.assertTrue(stringcaptor.getAllValues().get(13).equals(eMail));

    }

您正在嘗試驗證測試中准備好的語句的用法。 代碼的設置方式將不起作用,因為PreparedStatement的實例是在您要測試的方法中創建的: InsertPersonalData

但是您可以修改代碼,使其可測試。 第一步是將PreparedStatement的創建移到一個單獨的類中,然后可以在測試中對其進行模擬:

public class StatementProvider {
    public PreparedStatement createInsertStatementForPersonalData() {
        return PreparedStatement psmt = MysqlConnection.getPreparedStatement("INSERT INTO personal_data values(?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
    }
}

接下來,您更新PersonalDataDao以使用StatementProvider

public class PersonalDataDao {
    private StatementProvider statementProvider;
    // Constructor and other methods ommitted
    public void InsertPersonalData(PersonalData personaldata) throws SQLException, DAOException, ClassNotFoundException {
        try {
            PreparedStatement psmt = statementProvider.createInsertStatementForPersonalData(); 
            psmt.setString(1, personaldata.getiD());
            psmt.setString(2, personaldata.getPatientName());
            psmt.setString(3, personaldata.getBirthDate());
            psmt.setString(4, personaldata.getPlaceOfBirth());
            psmt.setString(5, personaldata.getGender());
            psmt.setString(6, personaldata.getNationality());
            psmt.setString(7, personaldata.getCurrentAddress());
            psmt.setString(8, personaldata.getCityAddress());
            psmt.setString(9, personaldata.getMaritalStatus());
            psmt.setString(10, personaldata.getOffspring());
            psmt.setString(11, personaldata.getAgeOfYoungestOffspring());
            psmt.setString(12, personaldata.getWorkNature());
            psmt.setString(13, personaldata.getPhoneNumber());
            psmt.setString(14, personaldata.geteMail());

            psmt.executeUpdate();

        } catch (SQLException e) {
            throw new DAOException(e);

        }
    } 
}

然后您的測試如下所示:

@RunWith(MockitoJUnitRunner.class)
public class PersonalDataDaoTest {

    @Mock
    private PreparedStatement psmt;
    @Mock
    private StatmentProvider statementProvider; 

    @InjectMocks
    private PersonalDataDao newDAO; // This is the class under test
    @Test
    public void HappyTestForInsert() throws SQLException, DAOException, ClassNotFoundException {
        when(statementProvider.createInsertStatementForPersonalData()).thenReturn(psmt);
        //ArgumentCaptor<Integer> intcaptor = ArgumentCaptor.forClass(int.class);
        ArgumentCaptor<String> stringcaptor = ArgumentCaptor.forClass(String.class);
        String id = "11";
        String patientName = "yara";
        String birthDate = "2001-12-5";
        String placeOfBirth = "cairo";
        String gender = "female";
        String nationality = "egyptian";
        String currentAddress = "cairo";
        String cityAddress = "cairo";
        String maritalStatus = "married";
        String offspring = "1";
        String ageOfYoungestOffspring = "2";
        String workNature = "teacher";
        String phoneNumber = "0324324234";
        String eMail = "yara@hotmail.com";

        PersonalData p = new PersonalData(id, patientName, birthDate, placeOfBirth, gender, nationality, currentAddress, cityAddress, maritalStatus, offspring, ageOfYoungestOffspring, workNature, phoneNumber, eMail);
        newDAO.InsertPersonalData(p);
        //verify(psmt, times(1)).setInt(anyInt(), intcaptor.capture());
        verify(psmt, times(14)).setString(anyInt(), stringcaptor.capture());
        Assert.assertTrue(stringcaptor.getAllValues().get(0).equals(id));
        Assert.assertTrue(stringcaptor.getAllValues().get(1).equals(patientName));
        Assert.assertTrue(stringcaptor.getAllValues().get(2).equals(birthDate));
        Assert.assertTrue(stringcaptor.getAllValues().get(3).equals(placeOfBirth));
        Assert.assertTrue(stringcaptor.getAllValues().get(4).equals(gender));
        Assert.assertTrue(stringcaptor.getAllValues().get(5).equals(nationality));
        Assert.assertTrue(stringcaptor.getAllValues().get(6).equals(currentAddress));
        Assert.assertTrue(stringcaptor.getAllValues().get(7).equals(cityAddress));
        Assert.assertTrue(stringcaptor.getAllValues().get(8).equals(maritalStatus));
        Assert.assertTrue(stringcaptor.getAllValues().get(9).equals(offspring));
        Assert.assertTrue(stringcaptor.getAllValues().get(10).equals(ageOfYoungestOffspring));
        Assert.assertTrue(stringcaptor.getAllValues().get(11).equals(workNature));
        Assert.assertTrue(stringcaptor.getAllValues().get(12).equals(phoneNumber));
        Assert.assertTrue(stringcaptor.getAllValues().get(13).equals(eMail));

    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM