java.lang.IllegalArgumentException: источник данных не указан Junit и Mockito - PullRequest
0 голосов
/ 08 февраля 2019

Доброе утро, люди!Я выполняю модульное тестирование в моем весеннем загрузочном приложении, но оно запускает следующее исключение: 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;
}

и это мой тест:

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: Извините за мой английский, я испанский!

1 Ответ

0 голосов
/ 08 февраля 2019

Вы пытаетесь протестировать класс, который использует 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);
}
Другой теоретический способ - это смоделировать JdbcTemplate и вставить его в ваш макет, используя @InjectMocks - но я бы не рекомендовал это делать - слишком громоздкое и хрупкое решение. Кроме того, принимая во вниманиечто ваш контроллер использует только JdbcTemplate в качестве зависимости, вы можете использовать встроенную DB для Junit и создать JdbcTemplate вручную и внедрить его в свой контроллер - в этом случае нет необходимостисоздайте контекст приложения, и вы можете просто вручную создать экземпляр контроллера и передать ему JdbcTemplate.См. this для получения дополнительной информации

Так что после шага 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 - чтобы сделать ваш код более читабельным.

Подробнее о тестировании с пружиной здесь

...