java - java.lang.IllegalArgumentException:未指定数据源 Junit 和 Mockito
问题描述
大家早上好!我正在我的 Spring Boot 应用程序中进行单元测试,但它启动了下一个异常: java.lang.IllegalArgumentException: No DataSource specified;
这是我的方法:
@RestController
public class controlador {
@Autowired(required = true)
JdbcTemplate conn;
@CrossOrigin
@RequestMapping(value = "/getlistadopantallatab", method = RequestMethod.POST, consumes="application/json",produces = "application/json")
@ResponseBody
public Map<String, Object> getListadoPantallaTab(@RequestBody Map<String,Object> dto) {
Map<String, Object> simpleJdbcCallResult = null;
try {
SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(conn)
.withCatalogName("CCR_PACKAGE")
.withProcedureName("getListadoPorPantallaTab");
SqlParameterSource in = new MapSqlParameterSource(dto);
simpleJdbcCallResult = simpleJdbcCall.execute(in);
} catch (Exception e) {
System.out.println("Se ha lanzado la siguiente excepcion: " + e);
}
return simpleJdbcCallResult;
}
这是我的测试:
public class controladorTest {
static controlador mockInstanced;
@BeforeClass
public static void setup() throws Exception {
mockInstanced= new controlador();
mockInstanced.conn = mock(JdbcTemplate.class);
}
/**
* Test of getListadoPantallaTab method, of class controlador.
*/
@Test
public void testGetListadoPantallaTab() {
System.out.println("Test unitario getListadoPantallaTab: ");
@SuppressWarnings("serial")
Map<String, Object> dto = new HashMap<String, Object>() {{
put("Inicio", 1);
put("fin", 15);
}};
mockInstanced.getListadoPantallaTab(dto);
}
有人知道我在做什么错吗?
PD:对不起我的英语,我是西班牙人!
解决方案
您正在尝试测试一个类,该类使用 bean 而不启动 Spring 的应用程序上下文。
有多种方法可以解决您的问题。
- 使 spring 运行应用程序上下文。您可以通过在测试类中添加:
@SpringBootTest
和@RunWith(SpringRunner.class)
注释来做到这一点。像这样的东西:
@SpringBootTest
@RunWith(SpringRunner.class)
public class controladorTest {
...
}
这样将创建 Spring 应用程序上下文 - 但您不必模拟控制器实例 - 因为它已经创建 - 所以您可以自动装配它:
@SpringBootTest
@RunWith(SpringRunner.class)
public class controladorTest {
@Autowired
private controlador controlador;
...
}
并删除下一行:
static controlador mockInstanced;
@BeforeClass
public static void setup() throws Exception {
mockInstanced= new controlador();
mockInstanced.conn = mock(JdbcTemplate.class);
}
- 另一种理论方法是模拟
JdbcTemplate
并将其注入到您的模拟中@InjectMocks
- 但我不建议这样做 - 过于繁琐和脆弱的解决方案。 - 此外,考虑到您的控制器仅用作依赖项,您可以为 Junit
JdbcTemplate
使用嵌入式数据库并手动创建并将其注入您的控制器 - 在这种情况下,无需创建应用程序上下文,您可以只需手动创建一个控制器实例并将 JdbcTemplate 传递给它。看到这个了解更多信息JdbcTemplate
因此,在第 1 步之后,您的代码应如下所示:
@SpringBootTest
@RunWith(SpringRunner.class)
public class controladorTest {
@Autowired
private controlador controlador;
/**
* Test of getListadoPantallaTab method, of class controlador.
*/
@Test
public void testGetListadoPantallaTab() {
System.out.println("Test unitario getListadoPantallaTab: ");
@SuppressWarnings("serial")
Map<String, Object> dto = new HashMap<String, Object>() {{
put("Inicio", 1);
put("fin", 15);
}};
controlador.getListadoPantallaTab(dto);
}
}
顺便说一下,请查看Java 命名约定- 以使您的代码更具可读性。
有关在此处使用弹簧进行测试的更多信息
推荐阅读
- ssl - Chrome 浏览器拒绝通过 HTTPS 连接到 AWS CloudFormer 实例
- python - Seaborn 图未显示所有带循环的图
- sql - 在 ODBC 链接的 Access 表中,什么决定了字段大小,以及如何更改它?
- r - R如何以类似编织的方式合并数据帧
- c# - 使用 UTF-8 编码的 WriteXML
- r - 如何根据部分字符串匹配的数量在多个实例上迭代函数?
- node.js - 在不阻止 mousemove 的情况下全局禁用 Windows 上的鼠标悬停事件
- c - 将未排序的 C 数组复制到另一个数组中,同时避免重复
- r - ggplot 中的图例
- python - 从 python 调用时,sql 中的 HASHBYTES、sha2_256 会引入坏字符