2017-06-29 97 views
1

我是使用java中的mockito進行junit測試的新手。我被困在一個點上。 我有一個抽象類AbstractA需要測試。 AbstractA的實現如下。如何處理在java中使用junit mockito依賴抽象方法的測試類

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(); 

請幫助我明白我應該需要在上述情況下做的。

回答

0

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

+0

感謝您的回覆,但我沒有完全確定。請詳細說明。 – Kamini

+0

我想你的意思是說直接給我輸入想要測試的方法調用。但我認爲它不是那麼測試,如果你已經爲該方法調用返回相同的輸出,那麼測試用例永遠不會失敗。 – Kamini

+0

不,你不是在嘲笑響應,只告訴Mockito在測試時實際調用方法。 – SKaul

0

你並不需要測試抽象類TDD一無所知抽象類,使之正常類,只有你有相同的重複代碼有兩個或多個類擡不起來抽象,測試這個班不會改變。指定sql查詢字符串和IPRowMapper作爲構造函數參數,這可以簡化並使代碼更加清晰。其次,你不需要這種複雜的測試設置,你只需要驗證交互,而不是返回值,只驗證模擬,傳遞給它的值。