繁体   English   中英

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

[英]java.lang.IllegalArgumentException: No DataSource specified Junit and Mockito

大家早上好! 我正在我的Spring Boot应用程序中进行单元测试,但它会启动下一个异常: java.lang.IllegalArgumentException:未指定DataSource;请参见图9。

这是我的方法:

@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的应用程序上下文。

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

  1. 使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);
}
  1. 另一种理论上的方法是模拟JdbcTemplate并使用@InjectMocks将其注入到模拟中-但我不建议这样做-太麻烦又脆弱的解决方案。
  2. 同样,考虑到您的控制器仅使用JdbcTemplate作为依赖项,您可以使用嵌入式DB for Junit并手动创建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命名约定 -使您的代码更具可读性。

有关在此处进行弹簧测试的更多信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM