2017-06-29 100 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作为构造函数参数,这可以简化并使代码更加清晰。其次,你不需要这种复杂的测试设置,你只需要验证交互,而不是返回值,只验证模拟,传递给它的值。