簡體   English   中英

如何使用Java中的Junit Mockito處理依賴抽象方法的測試類

[英]How to deal with test class who is having dependency on abstract method using junit mockito in java

我是使用Java中的Mockito進行junit測試的新手。 我被困在某一點上。 我有一個抽象類AbstractA需要測試。 實現AbstractA如下。

public abstract class AbstractA implements ADao {
    @Autowired
    NamedParameterJdbcTemplate jdbcTemplate;
    @Override
    public List<String> getColumns(Set<String> ids) {
        String sql = query();
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("ids", ids);
        return jdbcTemplate.query(sql, paramMap, rowMapper());
    }
    abstract protected String query();
    abstract protected AbstractIpRowMapper rowMapper();
}

上面的測試類是AbsractATest

public class AbsractATest {
    @InjectMocks 
    AbsractA abstractA;
    @Mock
    NamedParameterJdbcTemplate jdbcTemplate;

    @Mock AbstractIpRowMapper abstractIpRowMapper;
    @Before
    public void setUp() throws IOException, SQLException {
        abstractA=Mockito.mock(AbsractA.class, Mockito.CALLS_REAL_METHODS);
        jdbcTemplate=mock(NamedParameterJdbcTemplate.class);

        List<String> idsinput=new ArrayList<String>();
        idsinput.add("123");
        idsinput.add("124");
        idsinput.add("125");

        Set<String> ids=new LinkedHashSet<String>();
        ids.add("123");
        ids.add("124");
        ids.add("125");

        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("ids", ids);

        String query="select ids from tableA where ids=:ids";
        when(abstractA.query()).thenReturn(query);
        when(jdbcTemplate.query(query, paramMap,rowMapper())).thenReturn(idsinput);
        org.springframework.test.util.ReflectionTestUtils.setField(abstractA, "jdbcTemplate", jdbcTemplate);
    }

protected AbstractIpRowMapper rowMapper() {
    return absractIpRowmapper;
}
But after running this test case I am getting empty value for 
abstractA.getColumns();

請幫助我了解上述情況下我該怎么做。

運行doCallRealMethod()。when(abstractA).getColumns(); 在單元測試中

您不需要測試抽象類tdd對抽象類一無所知,使其成為普通類,只有兩個或多個類具有相同的代碼重復,才能將其提升為抽象,對該類的測試不會改變。 將sql查詢字符串和IPRowMapper指定為構造函數參數,這可以簡化代碼並使代碼更簡潔。 其次,您不需要為測試進行如此復雜的設置,只需要驗證交互,不返回值,僅驗證NamedParameterJdbcTemplate模擬,以及傳遞給它的值是什么。

暫無
暫無

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

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