Тест контроллера SpringBoot с использованием Mockito и jUnit5 не работает, поскольку Spring не может создать компонент класса PropertyService, который загружает свойства?

У меня есть простой проект весенней загрузки -

Вот структура проекта-

введите здесь описание изображения

Если я запускаю свое весеннее загрузочное приложение, оно работает нормально без каких-либо ошибок. Я смог получить всех клиентов, получить одного клиента, удалить клиента и добавить клиента с помощью моих методов контроллера остатка.

Через Postman я могу добавлять клиентов--

<Customer>
<firstName>TestData</firstName>
<lastName>Test</lastName>
<gender>M</gender>
<date>2020-01-26T09:00:00.000+0000</date>
<authId>6AE-BH3-24F-67FG-76G-345G-AGF6H</authId>
<addressdto>
<city>Test City</city>
<country>Test Country</country>
</addressdto>
</Customer>

Ответ

Customer with 34 sucessfully added

Это означает, что пока приложение запущено, оно может создать экземпляр PropertyService.java. таким образом, я могу получить доступ к идентификатору аутентификации, который присутствует в моем application-dev.properties через PropertyService.java. То же свойство присутствует в моем файле src/test/resources-> application.properties.

Есть две проблемы--

  1. Теперь, когда я запускаю свой класс HomeControllerTest.java asjUnit test , я получаю сообщение об ошибке. Я отладил и выяснил основную причину ошибки. Внутри моего класса HomeController.java он не может создать экземпляр класса PropertyService.java, поэтому я получаю там null pointer exception. Таким образом, дальнейшее выполнение тестового класса не удалось.
  2. Я не могу получить доступ к authId через PropertyService.java в своем тестовом классе, поэтому мне пришлось жестко кодировать.

Может ли кто-нибудь сказать мне, почему я получаю эту проблему? И как мне это исправить?

HomeController.java

@PostMapping("/customer")
    public ResponseEntity<String> addCustomer(@RequestBody CustomerDto customerDto) {
        String message = "";
        ResponseEntity<String> finalMessage = null;
        try {
            if ((!customerDto.getAuthId().equals(propertyService.getKeytoAddCustomer()))) {
                System.out.println("If check failed: "+propertyService.getKeytoAddCustomer());
                System.out.println("Unauthorized access attempted");
                message = "Unauthorized access attempted";
                finalMessage = new ResponseEntity<>(message, HttpStatus.UNAUTHORIZED);
            }
            System.out.println("If check passed :"+propertyService.getKeytoAddCustomer());

            Customer customer = mapper.mapToEntity(customerDto);
            customerService.addCustomer(customer);
            message = "Customer with " + customer.getId() + " sucessfully added";
            finalMessage = new ResponseEntity<>(message, HttpStatus.OK);

        } catch (Exception e) {
            message = "Failed to add customer due to " + e.getMessage();
            finalMessage = new ResponseEntity<>(message, HttpStatus.INTERNAL_SERVER_ERROR);
        }
        return finalMessage;
    }

PS- equals(propertyService.getKeytoAddCustomer())) (задача 1) --> здесь я получаю null pointer exception

PropertyService.java

package com.spring.liquibase.demo.utility;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;

@Configuration
@PropertySource("classpath:config.properties")
public class PropertyService {
    @Autowired
    private Environment env;

    public String getKeytoAddCustomer() {
        return env.getProperty("auth.key.to.add.customer");
    }
}

HomeControllerTest.java


@ExtendWith(SpringExtension.class)
class HomeControllerTest {
    private MockMvc mvc;

    @InjectMocks
    private HomeController homeController;

    @MockBean
    private CustomerService customerService;
//
//  @Autowired
//  private PropertyService propertyService;

    @BeforeEach
    public void setup() {
        mvc = MockMvcBuilders.standaloneSetup(homeController).build();
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testaddCustomer() throws Exception {
        String uri = "/customer";
        CustomerDto custDto = this.mockCustomerObject();
        String actualResult = mvc
                .perform(MockMvcRequestBuilders.post(uri).contentType(MediaType.APPLICATION_JSON)
                        .content(asJsonString(custDto)))
                .andExpect(MockMvcResultMatchers.status().isOk()).andReturn().getResponse().getContentAsString();
        Assertions.assertEquals(actualResult, "Customer with " + custDto.getId() + " sucessfully added");
    }

    private CustomerDto mockCustomerObject() {
        CustomerDto cusDto = new CustomerDto();
        AddressDto addressDto = new AddressDto();
        addressDto.setCity("BBSR");
        addressDto.setCountry("INDIA");
        cusDto.setDate(new Date());
        cusDto.setFirstName("Biprojeet");
        cusDto.setLastName("KAR");
        cusDto.setGender("M");
        cusDto.setAuthId(" 6AE-BH3-24F-67FG-76G-345G-AGF6H");
        cusDto.setAddressdto(addressDto);
        return cusDto;

    }

    public static String asJsonString(CustomerDto cusDto) {
        try {
            return new ObjectMapper().writeValueAsString(cusDto);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

PS- Я закомментировал коды, так как не могу получить доступ к файлу prop здесь. Нужна помощь и здесь (проблема 2)

application.properties — внутри src/test/resources

# DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)
spring.datasource.url=jdbc:mysql******useSSL=false
spring.datasource.username=****
spring.datasource.password=****

# Hibernate
# The SQL dialect makes Hibernate generate better SQL for the chosen database
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

# Hibernate ddl auto (create, create-drop, validate, update)
spring.jpa.hibernate.ddl-auto = update
logging.level.org.springframework.web=INFO
logging.level.com=DEBUG

customer.auth.key = 6AE-BH3-24F-67FG-76G-345G-AGF6H

приложение-dev.properties

same as above

application.properties внутри->src/main/resources

spring.profiles.active=dev
logging.level.org.springframework.web=INFO
logging.level.com=DEBUG
server.port=8080

Журнал ошибок jUnit

java.lang.AssertionError: Status expected:<200> but was:<500>
    at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:59)
    at org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.java:122)
    at org.springframework.test.web.servlet.result.StatusResultMatchers.lambda$matcher$9(StatusResultMatchers.java:627)
    at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:196)
    at com.spring.liquibase.demo.controller.HomeControllerTest.testaddCustomer(HomeControllerTest.java:50)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.base/java.lang.reflect.Method.invoke(Unknown Source)
    at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:436)
    at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:115)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:170)
    at org.junit.jupiter.engine.execution.ThrowableCollector.execute(ThrowableCollector.java:40)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:166)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:113)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:58)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.lambda$executeRecursively$3(HierarchicalTestExecutor.java:112)
    at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.executeRecursively(HierarchicalTestExecutor.java:108)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.execute(HierarchicalTestExecutor.java:79)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.lambda$executeRecursively$2(HierarchicalTestExecutor.java:120)
    at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(Unknown Source)
    at java.base/java.util.stream.ReferencePipeline$2$1.accept(Unknown Source)
    at java.base/java.util.Iterator.forEachRemaining(Unknown Source)
    at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Unknown Source)
    at java.base/java.util.stream.AbstractPipeline.copyInto(Unknown Source)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
    at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(Unknown Source)
    at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(Unknown Source)
    at java.base/java.util.stream.AbstractPipeline.evaluate(Unknown Source)
    at java.base/java.util.stream.ReferencePipeline.forEach(Unknown Source)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.lambda$executeRecursively$3(HierarchicalTestExecutor.java:120)
    at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.executeRecursively(HierarchicalTestExecutor.java:108)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.execute(HierarchicalTestExecutor.java:79)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.lambda$executeRecursively$2(HierarchicalTestExecutor.java:120)
    at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(Unknown Source)
    at java.base/java.util.stream.ReferencePipeline$2$1.accept(Unknown Source)
    at java.base/java.util.Iterator.forEachRemaining(Unknown Source)
    at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Unknown Source)
    at java.base/java.util.stream.AbstractPipeline.copyInto(Unknown Source)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
    at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(Unknown Source)
    at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(Unknown Source)
    at java.base/java.util.stream.AbstractPipeline.evaluate(Unknown Source)
    at java.base/java.util.stream.ReferencePipeline.forEach(Unknown Source)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.lambda$executeRecursively$3(HierarchicalTestExecutor.java:120)
    at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.executeRecursively(HierarchicalTestExecutor.java:108)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.execute(HierarchicalTestExecutor.java:79)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:55)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:43)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:170)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:154)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:90)
    at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:89)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)


person Arpan Banerjee    schedule 12.05.2020    source источник


Ответы (3)


После прохождения вашего репо вот окончательный код

@WebMvcTest(HomeController.class)
class HomeControllerTest {

@Autowired
private MockMvc mvc;

@MockBean
private CustomerService customerService;

@MockBean
private PropertyService propertyService;

@MockBean
private EntityToDtoMapper mapper;


@Test
public void testaddCustomer() throws Exception {
    String uri = "/customer";
    CustomerDto custDto = this.mockCustomerObject();
    Customer customer = getCustomerEntity();
    Mockito.when(mapper.mapToEntity(Mockito.any(CustomerDto.class))).thenReturn(customer);
    String actualResult = mvc
            .perform(MockMvcRequestBuilders.post(uri).contentType(MediaType.APPLICATION_JSON)
                    .content(asJsonString(custDto)))
            .andExpect(MockMvcResultMatchers.status().isOk()).andReturn().getResponse().getContentAsString();
    Assertions.assertEquals(actualResult, "Customer with " + custDto.getId() + " sucessfully added");
}

private CustomerDto mockCustomerObject() {
    CustomerDto cusDto = new CustomerDto();
    AddressDto addressDto = new AddressDto();
    addressDto.setCity("BBSR");
    addressDto.setCountry("INDIA");
    cusDto.setDate(new Date());
    cusDto.setFirstName("Biprojeet");
    cusDto.setLastName("KAR");
    cusDto.setGender("M");
    cusDto.setAuthId(" 6AE-BH3-24F-67FG-76G-345G-AGF6H");
    cusDto.setAddressdto(addressDto);
    return cusDto;

}


private Customer getCustomerEntity() {
    Customer customer = new Customer();
    Address address = new Address();
    address.setCity("BBSR");
    address.setCountry("INDIA");
    customer.setDate(new Date());
    customer.setFirstName("Biprojeet");
    customer.setLastName("KAR");
    customer.setGender("M");
    customer.setAddress(address);
    return customer;

}

public static String asJsonString(CustomerDto cusDto) {
    try {
        return new ObjectMapper().writeValueAsString(cusDto);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

}

Проблема в том, что вы смешиваете понятия. В вашей реализации вы пытались выполнить модульное тестирование, но ожидали поведения интеграции.

Поскольку вы использовали Spring boot с его тестовым стартовым набором, который поставляется с зависимостями фреймворка, такого как JUnit и Mockito, вы можете легко имитировать те классы и методы, которые вызывают исключение нулевого указателя, используя mockitio framework, потому что сервер не работает, а контейнер IOC не вверх, поэтому они NULL.

Итак, в вашем коде CustomerService, PropertyService и EntityToDtoMapper были NULL.

Итак, вопрос здесь в том, как мы можем загрузить контекст приложения spring без запуска сервера.

Это можно сделать двумя способами: либо загрузить весь контекст приложения Spring, используя аннотации @SpringBootTest и @AutoConfigureMockMvc.

Или мы можем сузить контекст приложения Spring только для самого контроллера, используя аннотацию @WebMvcTest.

Таким образом, решение, которое я использовал здесь, сужает тест до контроллера только с помощью аннотации @WebMvcTest(HomeController.class).

Но все же эти CustomerService, PropertyService и EntityToDtoMapper равны NULL. Таким образом, чтобы издеваться над этими классами, мы можем использовать аннотацию @Mock или @MockBean, но между этими аннотациями есть небольшая разница.

Метод Mockito.mock() позволяет нам создать фиктивный объект класса или интерфейса, а @MockBean — добавить фиктивные объекты в контекст приложения Spring. Макет заменит любой существующий bean-компонент того же типа в контексте приложения.

Итак, поскольку мы загрузили контекст приложения spring для контроллера, контроллер ожидает эти bean-компоненты и в контексте приложения, что может быть достигнуто с помощью аннотации @MockBean.

После насмешки над всеми этими bean-компонентами будет создан bean-компонент контроллера, но есть методы, в которых вы ожидаете некоторые возвращаемые значения, поэтому вам нужно закодировать ожидаемое возвращаемое значение в своем коде, что можно было бы сделать так

Mockito.when(mapper.mapToEntity(Mockito.any(CustomerDto.class))).thenReturn(customer);

если вы пропустите этот конкретный шаг, то в контроллере вы получите исключение указателя NULL в этой строке кода.

message = "Customer with " + customer.getId() + " sucessfully added";

Потому что вы кодируете

Customer customer = mapper.mapToEntity(customerDto);

вернет NULL.

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

Пожалуйста, дайте мне знать, если потребуется дополнительная помощь

person Anurag Srivastava    schedule 12.05.2020
comment
Да, возможно, проблема в том, что мое приложение не работает. Но это не работает, я получаю ту же ошибку. Мое приложение запущено, и я добавил аннотацию @Mock -- не работает. Мое приложение не было запущено + добавлена ​​аннотация @Mock - не работает. - person Arpan Banerjee; 12.05.2020
comment
Вы все еще получаете 500? - person Anurag Srivastava; 12.05.2020
comment
Если да, то это должно происходить из класса PropertyService, где у вас есть Autowired Environment. Таким образом, вы также должны издеваться над классом Environment. Но в реальном сценарии это своего рода интеграционное тестирование, а не модульное тестирование, потому что здесь вы получаете доступ ко всем трем уровням, то есть к контроллерам, сервису и уровню сохраняемости. - person Anurag Srivastava; 12.05.2020
comment
@Mock private PropertyService propertyService; @Mock private Environment env; Все равно не получилось. :( - person Arpan Banerjee; 12.05.2020
comment
если я использую @SpringBootTest над своим тестовым классом, то такая же ошибка, PropertyService это null. Пожалуйста, помогите мне. Попробуйте воссоздать проблему в вашей местности, если у вас есть свободное время. - person Arpan Banerjee; 12.05.2020
comment
Не могли бы вы поделиться своим кодом или репозиторием, чтобы я мог проверить проблему на моем локальном - person Anurag Srivastava; 13.05.2020
comment
конечно, вот исходный код - [github.com/Arpan619Banerjee/SpringBoot_rest_api] - person Arpan Banerjee; 13.05.2020
comment
Извините, Арпан, мне не удалось полностью выполнить код из-за плотного графика, и для этого потребовалась небольшая настройка БД, которой у меня нет на моем локальном компьютере в соответствии с требованиями вашего проекта .... но, конечно, я это настрою очень скоро. А пока не могли бы вы сказать мне, вы проводите интеграционное или модульное тестирование? и не могли бы вы предоставить свой журнал ошибок после насмешки над PropertyService - person Anurag Srivastava; 14.05.2020
comment
Это нормально. Ошибка, которую я получил после насмешки, была упомянута в комментариях к другому ответу. - person Arpan Banerjee; 14.05.2020
comment
Арпан, я обновил решение, пожалуйста, сделайте это. - person Anurag Srivastava; 16.05.2020
comment
Спасибо! Решение для обновления сработало как шарм! Однако остается одно сомнение: я все еще не могу получить доступ к службе поддержки в своем тестовом классе, ваше решение также жестко задает значение authKey . Я попытался получить его из PropertyService, но получил ошибку --- я могу жить с помощью жесткого кодирования в тестовом классе, так что это не imp, если вы хотите и у вас есть свободное время, вы можете изучить этот вопрос. .... - person Arpan Banerjee; 16.05.2020
comment
` ModelAndView: Имя представления = null Представление = null Модель = null FlashMap: Атрибуты = null MockHttpServletResponse: Статус = 500 Сообщение об ошибке = null Заголовки = [Content-Type:text/plain;charset=UTF-8, Content-Length:34] Тип содержимого = text/plain;charset=UTF-8 Body = Не удалось добавить клиента из-за нулевого URL-адреса для переадресации = null URL-адрес перенаправления = null Cookies = []`. - person Arpan Banerjee; 16.05.2020
comment
И есть еще одна ошибка. Это важный вопрос: мой тестовый пример проходит успешно, даже если я ставлю неправильный authId . Пожалуйста, попробуйте в вашем районе и дайте мне знать, если у вас такое же поведение. - person Arpan Banerjee; 16.05.2020

И еще одна ошибка. Это очень важно — мой тестовый пример проходит, даже если я даю неправильный идентификатор authId. Пожалуйста, попробуйте в вашем регионе и дайте мне знать, если у вас такое же поведение.

Конечно, ваш тест будет пройден, потому что ваш код проверяет только условия, которые не препятствуют выполнению кода. Пожалуйста, обратитесь к вашему коду ниже:

try {
        if ((!customerDto.getAuthId().equals(propertyService.getKeytoAddCustomer()))) {
            System.out.println("If check failed: "+propertyService.getKeytoAddCustomer());
            System.out.println("Unauthorized access attempted");
            message = "Unauthorized access attempted";
            finalMessage = new ResponseEntity<>(message, HttpStatus.UNAUTHORIZED);
        }
        System.out.println("If check passed :"+propertyService.getKeytoAddCustomer());

        Customer customer = mapper.mapToEntity(customerDto);
        customerService.addCustomer(customer);
        message = "Customer with " + customer.getId() + " sucessfully added";
        finalMessage = new ResponseEntity<>(message, HttpStatus.OK);

    }

Здесь при условии if вы только выполняете блок кодов, а затем получаете указание выполнить блок кода, который находится вне условия if.

Так что в условии if он ничего не делает. Поэтому вам нужно улучшить свой код в соответствии с вашим ожидаемым поведением.

Если вы хотите предотвратить выполнение своего кода, пожалуйста, обратитесь к приведенному ниже коду.

try {
        if ((!customerDto.getAuthId().equals(propertyService.getKeytoAddCustomer()))) {
            System.out.println("If check failed: "+propertyService.getKeytoAddCustomer());
            System.out.println("Unauthorized access attempted");
            message = "Unauthorized access attempted";
            return new ResponseEntity<>(message, HttpStatus.UNAUTHORIZED);
        }
        System.out.println("If check passed :"+propertyService.getKeytoAddCustomer());

        Customer customer = mapper.mapToEntity(customerDto);
        customerService.addCustomer(customer);
        message = "Customer with " + customer.getId() + " sucessfully added";
        finalMessage = new ResponseEntity<>(message, HttpStatus.OK);

    } catch (Exception e) {
        message = "Failed to add customer due to " + e.getMessage();
        e.printStackTrace();
        finalMessage = new ResponseEntity<>(message, HttpStatus.INTERNAL_SERVER_ERROR);
    }

Здесь я установил оператор return в условии If.

Но если вы хотите провалить текущий тестовый пример, в котором вы сравниваете сообщение, обратитесь к приведенному ниже коду:

try {
        if ((!customerDto.getAuthId().equals(propertyService.getKeytoAddCustomer()))) {
            System.out.println("If check failed: "+propertyService.getKeytoAddCustomer());
            System.out.println("Unauthorized access attempted");
            message = "Unauthorized access attempted";
            finalMessage = new ResponseEntity<>(message, HttpStatus.UNAUTHORIZED);
        }else {
            System.out.println("If check passed :" + propertyService.getKeytoAddCustomer());

            Customer customer = mapper.mapToEntity(customerDto);
            customerService.addCustomer(customer);
            message = "Customer with " + customer.getId() + " sucessfully added";
            finalMessage = new ResponseEntity<>(message, HttpStatus.OK);
        }

    } catch (Exception e) {
        message = "Failed to add customer due to " + e.getMessage();
        e.printStackTrace();
        finalMessage = new ResponseEntity<>(message, HttpStatus.INTERNAL_SERVER_ERROR);
    }

Здесь вам просто нужно установить блок кода, который находится за пределами условия if в части else.

person Anurag Srivastava    schedule 16.05.2020
comment
Да, это была глупая ошибка с моей стороны, я забыл оператор возврата, но теперь он вернулся к точке 0. Теперь, после добавления оператора возврата после проверки if (ur If you would like to prevent your code execution then please refer the code below пример кода). Тестовый класс всегда возвращает статус 401 uauthorized. После отладки я заметил, что athKey в HomeController равно нулю, как и раньше. Вы пробовали это в вашем местном? С нетерпением жду вашего ответа! - person Arpan Banerjee; 16.05.2020
comment
Привет ... У вас была возможность попробовать это? - person Arpan Banerjee; 19.05.2020

Попробуйте издеваться над PropertyService с помощью @MockBean или @Mock.

Я заметил, что вам не хватает @WebMvcTest(Controller.class) над определением класса, которое вам понадобится для модульного тестирования контроллеров Mvc. Объяснение

Если @MockBean не работает.

Пытаться:

Используя Mockito.when(), вы можете просто вернуть желаемый/ожидаемый результат и при вызове нужного метода.

Используйте Mockito.verify(), чтобы гарантировать выполнение желания.

when(propertyService.getKeytoAddCustomer()).thenReturn("Desired String");

when(customerService.addCustomer(customerObject)).thenReturn("Desired result");

//DO mvc.perform(...);

verify(propertyService).getKeytoAddCustomer();

verify(customerService).addCustomer(customerObject());

Проблема вторая

Я предполагаю, что проблема с файлом свойств связана с тем, что вы используете spring.profile.active=dev, но файл свойств test/resources имеет значение application.properties вместо application-dev.properties, несмотря на то, что это единственный файл свойств в test/resources. Переименуйте файлы одинаково в обеих папках ресурсов и посмотрите, что произойдет.

person Tony    schedule 12.05.2020
comment
Решение проблемы 2 не сработало, значение по-прежнему жестко запрограммировано, но после добавления @WebMvcTest(HomeController.class) я получаю эту ошибку---Description: Field propertyService in com.spring.liquibase.demo.controller.HomeController required a bean of type 'com.spring.liquibase.demo.utility.PropertyService' that could not be found. The injection point has the following annotations: - @org.springframework.beans.factory.annotation.Autowired(required=true) Action: Consider defining a bean of type 'com.spring.liquibase.demo.utility.PropertyService' in your configuration. - person Arpan Banerjee; 12.05.2020
comment
если я использую @SpringBootTest над своим тестовым классом, то такая же ошибка, PropertyService равна нулю. - person Arpan Banerjee; 12.05.2020
comment
Не используйте @SpringBootTest. Вместо этого используйте @RunWith(SpringRunner.class). Вы определили @MockBean PropertyService propertyService; так? - person Tony; 12.05.2020
comment
Я использую jUnit5, поэтому @RunWith заменяется на @ExtendWith(SpringExtension.class), я использую это - person Arpan Banerjee; 12.05.2020