anyString () เป็น null แทนสตริงว่าง

Sep 04 2020

ฉันพยายามทดสอบ dao ของฉันอย่างไรก็ตามเมื่อฉันผ่าน anyString () ใน dao ของฉันมันออกมาเป็นสตริงว่างและด้วยเหตุนี้มันจึงไม่ส่งคืนวัตถุที่ถูกเยาะเย้ยของฉันที่ฉันต้องการ

@InjectMocks
private Dao dao;

@Mock
@Qualifier("jdbcTemp")
private JdbcTemplate jdbcTemp;

@Test
public void testGetData() {
    List<MyObj> list = new ArrayList<>();
    MyObj myObj = new MyObj();
    myObj.setMethod("method val");
    list.add(myobj);

    Mockito.when(jdbcTemp.query(anyString(), Mockito.any(PreparedStatementSetter.class),
        Mockito.any(Dao.MyRowMapper.class))).thenReturn(list);

    List<MyObj> res = dao.getData(param1, param2); // this is empty, instead of having a value of 1

    Assertions.assertThat(res).isNotNull();
}

ดาวของฉัน

@Autowired
private String query;

@Autowired
private JdbcTemplate jdbcTemp;

public List<MyObj> getData(String arg1, String arg2) {
    List<MyObj> list = new ArrayList<MyObj>();

    try {
        // query below is null instead of empty string
        list.addAll(jdbcTemp.query(query, new PreparedStatementSetter() {
            public void setValues(PreparedStatement pstmt) throws SQLException {
                pstmt.setString(PARAM_ONE, arg1);
                pstmt.setString(PARAM_TWO, arg2);
            }
        }, new MyRowMapper()));
    } catch (Exception exp) {
    
}

return list;

}

คำตอบ

Campingenieur Sep 04 2020 at 14:55

ดังที่คุณกล่าวอย่างถูกต้องanyString()จะจับคู่เฉพาะสตริงที่ไม่ใช่ค่าว่างเท่านั้น และเมื่อคุณผ่านqueryเข้าไปในวิธีการของคุณคุณควรตรวจสอบว่าระบบอัตโนมัติของคุณqueryไม่เป็นโมฆะ เป็นทางเลือกอื่นที่คุณสามารถยึดติดany()หรือnullable(String.class)ตรงกับค่าว่าง เนื่องจากการทดสอบของคุณไม่ได้ขึ้นอยู่กับqueryค่าที่คุณสามารถใช้ได้อย่างปลอดภัย

อย่างไรก็ตามเนื่องจากรหัสของคุณไม่ได้แสดงให้เห็นว่าการฉีดของคุณทำงานอย่างไรเราจึงไม่สามารถตรวจสอบปัญหาของคุณเพิ่มเติมได้ หากจำเป็นสำหรับคุณโปรดเพิ่มส่วนรหัสที่เกี่ยวข้อง