Метод фиктивного бина теста интеграции при загрузке с несколькими аргументами возвращает ноль - PullRequest
0 голосов
/ 06 марта 2019

У меня есть простое приложение весенней загрузки с классами Controller, Service, Business и Util, поэтому я пытаюсь смоделировать метод в компоненте MockUtil, который принимает четыре параметра, но возвращает null

MockMainController

@RestController
public class MockMainController {

@Autowired
private MockBusiness mockBusiness;

@GetMapping("request")
public MockOutput mockRequest() {
    return mockBusiness.businessLogic(new MockInput());

    }

 }

MockBusiness

@Service
public class MockBusiness {

@Autowired
private MockService mockService;

public MockOutput businessLogic(MockInput input) {
    return mockService.serviceLogic(input);
    }

 }

MockService

@Service
public class MockService {

@Autowired
private MockUtil mockUtil;

public MockOutput serviceLogic(MockInput input) {

    ResponseEntity<MockOutput> res = mockUtil.exchange(UriComponentsBuilder.fromUriString(" "), HttpMethod.GET,
            HttpEntity.EMPTY, new ParameterizedTypeReference<MockOutput>() {
            });
    return res.getBody();

    }

 }

MockUtil

@Component
public class MockUtil {

@Autowired
private RestTemplate restTemplate;

public <T> ResponseEntity<T> exchange(UriComponentsBuilder uri, HttpMethod method, HttpEntity<?> entity,
        ParameterizedTypeReference<T> typeReference) {

    try {

        ResponseEntity<T> response = restTemplate.exchange(uri.toUriString(), method, entity, typeReference);

        return response;
    } catch (HttpStatusCodeException ex) {
        System.out.println(ex);
        return new ResponseEntity<T>(ex.getStatusCode());
    } catch (Exception ex) {
        ex.printStackTrace();
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
         }
     }

 }

Ниже приведен мой простой тестовый класс, когда когда-либо вызывается метод mockUtil.exchange, я хочу вернуть объект на основе ParameterizedTypeReference<T>

MockControllerTest

@SpringBootTest
@ActiveProfiles("test")
@Profile("test")
@RunWith(SpringRunner.class)
public class MockControllerTest {

@Autowired
private MockMainController mockMainController;

@MockBean
private MockUtil mockUtil;

@Test
public void controllerTest() {

    given(this.mockUtil.exchange(ArgumentMatchers.any(), ArgumentMatchers.any(), ArgumentMatchers.any(),
            ArgumentMatchers.any(new ParameterizedTypeReference<MockOutput>() {
            }.getClass()))).willReturn(ResponseEntity.ok().body(new MockOutput("hello", "success")));

    MockOutput output = mockMainController.mockRequest();
    System.out.println(output);

    }

 }

При отладке я вижу, что mockUtil.exchange возвращает null

1 Ответ

1 голос
/ 06 марта 2019

Похоже, что вы соответствуете ParameterizedTypeReference не работает.Он не соответствует ожидаемому.

Попробуйте следующее:

given(mockUtil
    .exchange(
        ArgumentMatchers.any(),
        ArgumentMatchers.any(),
        ArgumentMatchers.any(),
        // eq matches to any param of the same generic type
        ArgumentMatchers.eq(new ParameterizedTypeReference<MockOutput>(){})))
.willReturn(ResponseEntity.ok().body(new MockOutput("hello", "success")));

После нескольких тестов кажется, что если вы не используете eq, Mockito ожидает, что переданный ParameterizedTypeReference будеттот же экземпляр , что и в given(..), а с eq он просто проверяет, что он представляет тот же универсальный тип.

Проверьте этот вопрос для получения более подробной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...