java.lang.IllegalArgumentException:没有指定Junit和Mockito的数据源

java.lang.IllegalArgumentException:没有指定Junit和Mockito的数据源,java,spring,testing,junit,mocking,Java,Spring,Testing,Junit,Mocking,大家早上好! 我正在spring boot应用程序中进行单元测试,但它会启动下一个异常: java.lang.IllegalArgumentException:未指定数据源 这是我的方法: @RestController public class controlador { @Autowired(required = true) JdbcTemplate conn; @CrossOrigin @RequestMapping(value = "/getlistadopantallatab",

大家早上好! 我正在spring boot应用程序中进行单元测试,但它会启动下一个异常: java.lang.IllegalArgumentException:未指定数据源

这是我的方法:

@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;
}
@RestController
公共类控制程序{
@自动连线(必需=真)
jdbc模板连接;
@交叉起源
@RequestMapping(value=“/getListadoPantalatab”,method=RequestMethod.POST,consumes=“application/json”,products=“application/json”)
@应答器
公共映射getListaDoPantalTab(@RequestBody映射dto){
映射SimpleJDBCAllResult=null;
试一试{
SimpleJDBCall SimpleJDBCall=新SimpleJDBCall(conn)
.withCatalogName(“CCR\U包”)
.withProcedureName(“GetListadoPorportallatab”);
SqlParameterSource in=新映射SqlParameterSource(dto);
SimpleJDBCAllResult=SimpleJDBCall.execute(在中);
}捕获(例外e){
System.out.println(“Se ha lanzado la siguiente excepcion:”+e);
}
返回SimpleJDBCAllResult;
}
这是我的测试:

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);
}
公共类控制测试{
静态控制和模拟实例;
@课前
public static void setup()引发异常{
mockInstanced=newcontrolador();
mockInstanced.conn=mock(JdbcTemplate.class);
}
/**
*测试controlador类的GetListaDoPantalTab方法。
*/
@试验
public void testGetListadoPantalTab(){
System.out.println(“testunitario getlistadopantalatab:”);
@抑制警告(“串行”)
Map dto=newhashmap(){{
put(“Inicio”,1);
put(“fin”,15);
}};
mockInstanced.getListadoPantalTab(dto);
}
有人知道我做错了什么


PD:对不起,我是西班牙人!您正在测试一个类,该类在不启动Spring应用程序上下文的情况下使用bean

有多种方法可以解决您的问题

  • 使spring运行应用程序上下文。您可以通过向测试类添加:
    @SpringBootTest
    @RunWith(SpringRunner.class)
    注释来完成此操作。类似于以下内容:
  • 通过这种方式,将创建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
    将其注入到您的模拟中-但我不建议这样做-这是一个过于繁琐和脆弱的解决方案
  • 另外,考虑到您的控制器仅使用
    JdbcTemplate
    作为依赖项,您可以使用嵌入式并手动创建
    JdbcTemplate
    ,然后将其注入控制器-在这种情况下,无需创建应用程序上下文,您只需手动创建一个控制器实例并传递JdbcT即可部署到它。有关更多信息,请参阅
  • 因此,在步骤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);
        }
    }
    
    @SpringBootTest
    @RunWith(SpringRunner.class)
    公开课考试{
    @自动连线
    私人控制者控制者;
    /**
    *测试controlador类的GetListaDoPantalTab方法。
    */
    @试验
    public void testGetListadoPantalTab(){
    System.out.println(“testunitario getlistadopantalatab:”);
    @抑制警告(“串行”)
    Map dto=newhashmap(){{
    put(“Inicio”,1);
    put(“fin”,15);
    }};
    controlador.getListadoPantalTab(dto);
    }
    }
    
    顺便说一句,请看-使您的代码更具可读性


    关于使用Spring

    HI @ Edu马丁内兹的更多信息,如果这个或任何答案已经解决了你的问题,请考虑通过点击复选标记来接受它。这向更广泛的社区表明,你已经找到了解决方案,并给回答者和你自己带来了一些声誉。没有义务这样做。
    @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);
        }
    }