Макет статического метода с использованием RestAssuredMockMvc для весенних облачных контрактов

#java #junit5 #rest-assured #mockmvc #spring-cloud-contract

#java #junit5 #будьте уверены #mockmvc #spring-cloud-contract

Вопрос:

Я пытался создать статический метод на стороне производителя для создания и запуска контрактов с контроллером, но тесты выполняются против фактического метода

Вот контроллер в producer, где «getId» — это статический метод в классе

  @PostMapping(path = "/getone", consumes = "application/json", produces = "application/json")
public ResponseEntity<Response> getone(@RequestBody Test[] test) {
    String appId = Utils.getId();
    return new ResponseEntity<>(service.pub(test,id), HttpStatus.OK);
}
  

Вот базовый тест на стороне производителя, который генерирует контракты

 @ExtendWith(SpringExtension.class)
@ActiveProfiles("test")
@SpringBootTest
public class ContractTest {
    
    @Autowired
    private WebApplicationContext context;

    @Mock
    private Utils utils;

    @BeforeEach
    void setup() {
        try (MockedStatic mocked = mockStatic(Utils.class)) {
            mocked.when(() -> Utils.getId()).thenReturn("194");
            RestAssuredMockMvc.webAppContextSetup(this.context);}
    }
  

Я также пытался использовать автономную настройку, но безуспешно

  @Autowired
    private ApiController controller;

  @BeforeEach
    void setup() {
        try (MockedStatic mocked = mockStatic(Utils.class)) {
            mocked.when(() -> Utils.getId()).thenReturn("194");
        StandaloneMockMvcBuilder standaloneMockMvcBuilder = MockMvcBuilders.standaloneSetup(controller);
         RestAssuredMockMvc.standaloneSetup(standaloneMockMvcBuilder);}
  

Тесты выполняются для фактического класса, а не для фиктивного значения. Есть ли какой-либо способ смоделировать статический метод getId() и сгенерировать тесты?

Ответ №1:

Можете ли вы попробовать заменить эту строку:

 try (MockedStatic mocked = mockStatic(Utils.class)) {
  

Для

 try (MockedStatic<Utils> mocked = mockStatic(Utils.class)) {
  

Комментарии:

1. Привет, @Steephen, спасибо за ответ, но это не сработало

2. @sn879 Можете ли вы удалить @Mock private Utils utils; эту строку из своего тестового класса вместе с вышеуказанными изменениями

3. Я думаю, что это неиспользуемая зависимость, которую я только что скопировал, но я попытался удалить ее и повторно запустить тесты, и она вызывает фактический метод, а не макет