Нуль передается в службу автоматической проводки даже после насмешки - SpringBootTest - PullRequest
1 голос
/ 08 июня 2019

Я хотел провести интеграционное тестирование моего API.

@RestController
@RequestMapping("/api/v1")
public class TestController {

    @Autowired
    TestService testService;

    @RequestMapping("/welcome")
    public String welcomeMessage(@RequestParam("name") String name) {
        return testService.welcomeMessage(name);
    }
}

Ниже приведен интерфейс службы и его реализация:

public interface TestService {
    public String welcomeMessage(String name);
}

public class TestServiceImpl implements TestService{
    @Autowired
    TestRepository repo;

    @Override
    public String welcomeMessage(String name) {
        repo.save(new StringEntity(name));
        return "Hello "+name;
    }
}

Ниже приведен тестовый пример:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class MockitoTestingApplicationTests {

    @Autowired
    MockMvc mvc;

    @MockBean
    TestService testService;

    @MockBean
    TestController testController;

    @Test
    public void contextLoads() throws Exception {
        Mockito.when(testController.welcomeMessage(ArgumentMatchers.anyString())).thenCallRealMethod();
        Mockito.when(testService.welcomeMessage(ArgumentMatchers.anyString())).thenCallRealMethod();

        mvc.perform(get("/api/v1/welcome").param("name", "dude")).andExpect(status().isOk());
    }

}

У меня есть несколько вопросов.

  1. , когда я выполняю приведенный выше код, он выдает ошибку, говоря, что не может вызвать реальный метод для абстрактных методов.И когда я издеваюсь над TestServiceImpl, он бросает NullPointerException в контроллер, потому что TestService равен нулю.Как мне это исправить?

  2. Как мне издеваться над уровнем хранилища, когда мы используем MongoDB.когда я пытаюсь смоделировать MongoTemplate, выдает ошибку, говорящую MongoConvertor must not be null

  3. Это правильный способ написания тестовых случаев.можем ли мы получить покрытие кода без использования thenCallRealMethod()?

Пожалуйста, предложите мне, как поступить.Заранее спасибо.

1 Ответ

1 голос
/ 08 июня 2019

Убедитесь, что у вас есть реализация службы, т. Е. TestServiceImpl, помеченная @Service (или @Component, если это не строго услуга), и используйте шпионаж вместо насмешки:

@SpyBean
TestService testService;

Шпионаж по умолчанию вызывает реальные методы, поэтому вы должны смоделировать их той реализацией, которую не хотите вызывать.

Относительно репозиториев, вы должны высмеивать компоненты, отмеченные @Repository, а не фактические SessionFactory / Template и т. Д., Используемые внутри.

...