gpt4 book ai didi

mocking - 如何测试 SimpleJdbcCall

转载 作者:行者123 更新时间:2023-12-02 17:14:11 25 4
gpt4 key购买 nike

我需要为此代码创建测试。

@Autowired
JdbcTemplate jdbcTemplate;

public List<Row> getData(int id) {
// Preconditions here

SimpleJdbcCall getCall = new SimpleJdbcCall(jdbcTemplate)
.withSchemaName(SCHEMA)
.withProcedureName(SP)
.declareParameters(
// ...
)
.returningResultSet("result", (RowMapper<QuestionAnswerRow>) (rs, rowNum) -> .....);

MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("id", id);
// other parameters here

Map queryRes = getCall.execute(params);
List<row> res = (List<row>) queryRes.get("result");
return res;
}

你能告诉我如何用 Mockito 模拟这里的 getCall.execute(params) 响应吗?

最佳答案

这里的问题是,您在方法中创建了整个 getCall 对象,这使得几乎不可能以某种方式将模拟注入(inject)该进程。

这里有几种可能性:

a) 您可以模拟您的 jdbcTemplate,然后尝试通过模拟 getCall 将对 jdbcTemplate 进行的所有调用来使其正常工作.由于 jdbcTemplate 可能会完成所有实际的数据库工作,这可以工作,但老实说,这可能不值得付出努力(因为它绝对不平凡)。

b) 您可以将整个测试切换为集成测试,例如让它针对内存中的数据库运行。当然,有很多反对使用集成测试代替单元测试的论据,所以这可能也不是最好的方法。不过,这是可能的,并且使用 Spring 测试实用程序和注释可以非常简单。

c) 这给我们留下了一些工作,在这种情况下意味着重构:

由于您的问题是您在内部创建了 SimpleJdbcCall,因此一种解决方案是将该部分提取到工厂中。这个简化的例子表明:

@Component
class SimpleJdbcCallFactory {
public SimpleJdbcCall create(JdbcTemplate template) {
return new SimpleJdbcCall(template);
}
}

现在您可以向您的类添加一个@Autowired 依赖项,然后在您的单元测试中模拟该依赖项...

@RunWith(MockitoJUnitRunner.class)
public class YourTestClassHere {

@Mock
private SimpleJdbcCallFactory simpleJdbcCallFactory;

@InjectMocks
private YourClassHere classToTest;

@Test
public void test() {
SimpleJdbcCall mockedCall = Mockito.mock(SimpleJdbcCall.class);
Mockito.when( simpleJdbcCallFactory.create(Mockito.any())).thenReturn(mockedCall);
Mockito.when( mockedCall ).withSchemaName(Mockito.anyString()).thenReturn(mockedCall);
// etc. unfortunately needed for fluent apis (unless they added those in mockito)
Mockito.when( mockedCall.execute(Mockito.any()).thenReturn( ... );

classToTest.getData(123);
}

}

关于mocking - 如何测试 SimpleJdbcCall,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47429826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com