@TestPropertySource не помогает получать значения свойств конфигурации - PullRequest
0 голосов
/ 29 января 2020

В следующем фрагменте кода теста значения number_of_days.last и number_of_months.plan не извлекаются из файла конфигурации. Пожалуйста, проверьте и посмотрите, в чем может быть причина. Когда я удаляю аннотацию @Value из моего класса обслуживания ShiftPlanService. java и просто инициализируйте значения там требуемыми значениями, тест проходит. Файл

@ExtendWith(MockitoExtension.class)
@ContextConfiguration(classes=SpringbootMysqlExampleApplication.class)
@TestPropertySource(locations="src/main/resources/application.properties",properties= {"number_of_days.last= 7","number_of_months.plan= 2"})
class ShiftPlanServiceTest {
        @Mock
        ShiftPlanRepo mockedSpr;

        @Mock(lenient = true)
        ShiftDetailsRepo mockedSdr;

        @Mock(lenient = true)
        EmployeeDetailsRepo mockedEdr;

        @Spy
        ShiftPlanService sps;

        @BeforeEach
        public void setUp() {
            when(mockedSdr.findShiftNameById(1)).thenReturn("Morning");
            when(mockedSdr.findShiftNameById(2)).thenReturn("Afternoon");
            when(mockedEdr.getNameById(0)).thenReturn("Amit");
            when(mockedEdr.getNameById(1)).thenReturn("Anupam");
            when(mockedEdr.getNameById(2)).thenReturn("Chirag");
            when(mockedEdr.getNameById(3)).thenReturn("Rashmi");
            when(mockedEdr.count()).thenReturn(4L);
        }

        @Test
        public void testCreateShiftPlan() {
            sps.createShiftPlan(4, 1, 2020);
            verify(mockedSpr, times(36)).save(any(ShiftPlan.class));
            verifyNoMoreInteractions(mockedSpr);
        }
   } 

application.properties выглядит следующим образом-

server.port=8104
number_of_days.last= 7
number_of_months.plan= 2
spring.datasource.url=jdbc:mysql://${MYSQL_HOST:localhost}:3306/shiftplannerdatabase
spring.datasource.username=root
spring.datasource.password=WILLsuc95#

#Keep the connection alive while idle for a long time
spring.datasource.testWhileIdle= true
spring.datasource.validationQuery= SELECT 1

# Show or not log for each sql query
spring.jpa.show-sql = true

# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto = update

# Naming strategy
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy

# Use spring.jpa.properties.* for Hibernate native properties (the prefix is
# stripped before adding them to the entity manager)

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

В классе ShiftPlanService у меня есть

@Value("${number_of_days.last}")
public int ndl;

@Value("${number_of_months.plan}")
public int nm;

Ответы [ 3 ]

0 голосов
/ 31 января 2020

Вы путаете инъекцию Мокито с пружинной инъекцией. @Value - это концепция Spring, которая будет внедрена только тогда, когда Spring управляет bean-компонентом, но экземпляр ShiftPlanService, который у вас есть в тесте, вводится с помощью Mockito с использованием @Spy (что, как было указано, не Это действительно нужно).

Моя рекомендация будет состоять в том, чтобы решить, что вы хотите - модульное тестирование с использованием макетов или полномасштабный тест Spring с запущенным контекстом приложения. Мне кажется, что вы намереваетесь написать модульный тест со всем вычеркнутым, в этом случае:

  • remove @ContextConfiguration и @TestPropertySource (они вам не нужны для модульных тестов)
  • используйте @InjectMocks вместо @Spy на ShiftPlanService sps - он, скорее всего, будет делать то, что вы хотите, в зависимости от того, как реализован ShiftPlanService
  • , вручную установите необходимые значения конфигурации в sps; вы можете добавить сеттеры для тех, кто будет использовать тест; если модульный тест находится в том же пакете, что и класс - что является хорошей практикой - они также могут быть частными для пакета - потому что в производственной среде Spring будет автоматически связывать их для вас, поэтому они нужны только для теста
  • о, и сохраните аннотацию @Value в своем ShiftPlanService - она ​​необходима для производства - как описано выше
0 голосов
/ 31 января 2020

Мы изобрели расширение Mockito, которое позволяет легко вводить свойства String / Integer / Boolean. Изучите файл readme, он очень прост в использовании и работает вместе с @InjectMocks

https://github.com/exabrial/mockito-object-injection

0 голосов
/ 29 января 2020

Я думаю, вы намереваетесь использовать реальный экземпляр ShiftPlanService и вводить макеты. Вам нужно, чтобы Spring автоматически подключил ShiftPlanService к вашему тесту и сказал, чтобы он вставлял макеты следующим образом:

@Autowired
@InjectMocks
ShiftPlanService sps;

Хотя вы можете рассмотреть возможность создания ShiftPlanService самостоятельно в своем методе настройки и просто передать свои макеты и установить другие свойства на ShiftPlanService вместо этого.

...