gpt4 book ai didi

java - 如何在Junit(Spring Boot)中模拟BeanPropertyRowMapper?

转载 作者:行者123 更新时间:2023-12-02 09:15:22 25 4
gpt4 key购买 nike

我正在为电子邮件 DAO 层编写一个测试用例。类似于:

@Repository
@PropertySource({ "classpath:/query.properties" })
public class DaoLayerImpl implements DaoLayerDao {

/** The jdbc template. */
@Qualifier("mariaJdbcTemplate")
@Autowired
private JdbcTemplate jdbcTemplate;

/** The find staged query. */
@Value("${someQuery}")
String someQuery;

@Override
public List<SomeBean> getData() throws MariaDbException {

List<SomeBean> listOfData = new ArrayList<>();
try {
listOfData = jdbcTemplate.query(someQuery,
new BeanPropertyRowMapper<SomeBean>(SomeBean.class));
} catch (RuntimeException e) {
logger.error("RuntimeException in ", e);
}

return listOfData;
}
}

该层的测试用例是:

@RunWith(SpringRunner.class)
@ActiveProfiles("test")
@PropertySource("classpath:application-test.properties")
public class EmailDaoLayerTest {

@MockBean
JdbcTemplate jdbcTemplate;

@InjectMocks
DaoLayerImpl dao;

@Before
public void setup() {
MockitoAnnotations.initMocks(this);
jdbcTemplate = Mockito.mock(JdbcTemplate.someQuery);
ReflectionTestUtils.setField(dao, "jdbcTemplate", jdbcTemplate);

}

@Test
public void testCaseForGetData() throws Exception {
List<SomeBean> beanObject = new ArrayList<>();
beanObject.add(new SomeBean());
beanObject.add(new SomeBean());
beanObject.add(new SomeBean());

System.out.println(beanObject.size()); // 3

when(jdbcTemplate.query("someQuery",
new BeanPropertyRowMapper<SomeBean>(SomeBean.class))).thenReturn(beanObject);


List<SomeBean> obj = dao.getData();

System.out.println(obj.size()); //0

System.out.println("Done");

}

}

模拟后,对象大小为 0 而不是 3。返回之前对象的大小为 3。当我实际点击 DAO 时,对象的大小为 0,而我已经模拟了使用when-then的jdbc模板。

模拟 Bean Property Row Mapper 类的正确方法是什么?

最佳答案

让我回答这个问题,然后批评你的方法,也许这将有助于更好地理解解决方案最终应该是什么样子。

所以回答你的问题:

从技术上讲,你可能可以这样做:

import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.any;
...
Mockito.when(jdbcTemplate.query(eq("someQuery"),
any(BeanPropertyRowMapper.class)).thenReturn(....);

但是,您应该问自己,您到底想在这里测试什么?这里有一个相对昂贵的集成测试,它运行 Spring Context(它与 SpringRunner 一起工作)并在后台创建许多对象。

但是,根据要测试的方法 - 我没有看到有任何“有意义的”(需要测试)代码需要测试。您可以测试给定的查询,BeanPropertyRowMapper 确实可以将响应转换为 SomeBean 的实例,但您再次模拟它,它并没有真正运行。

您可以检查您准备的查询是否针对数据库运行并返回预期结果,但您似乎没有在此处准备任何数据库。

因此,如果目的是覆盖范围 - 那么是的,您将被覆盖,但测试不是关于覆盖范围,而是让您“确定”您的代码正常工作。在这种情况下,运行 Spring 驱动的集成测试(带有应用程序上下文和所有内容)似乎是一个巨大的杀伤力,MockitoRunner 可以完成这项工作

关于java - 如何在Junit(Spring Boot)中模拟BeanPropertyRowMapper?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59044267/

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