mockito @TestPropertySource无法帮助提取配置属性值

svgewumm  于 2022-11-08  发布在  其他
关注(0)|答案(3)|浏览(192)

在下面的测试代码片段中,无法从配置文件中提取number_of_days.last和number_of_months.plan的值。请检查原因。当我从服务类www.example.com中删除@Value注解ShiftPlanService.java并使用所需的值初始化其中的值时,测试通过。

  1. @ExtendWith(MockitoExtension.class)
  2. @ContextConfiguration(classes=SpringbootMysqlExampleApplication.class)
  3. @TestPropertySource(locations="src/main/resources/application.properties",properties= {"number_of_days.last= 7","number_of_months.plan= 2"})
  4. class ShiftPlanServiceTest {
  5. @Mock
  6. ShiftPlanRepo mockedSpr;
  7. @Mock(lenient = true)
  8. ShiftDetailsRepo mockedSdr;
  9. @Mock(lenient = true)
  10. EmployeeDetailsRepo mockedEdr;
  11. @Spy
  12. ShiftPlanService sps;
  13. @BeforeEach
  14. public void setUp() {
  15. when(mockedSdr.findShiftNameById(1)).thenReturn("Morning");
  16. when(mockedSdr.findShiftNameById(2)).thenReturn("Afternoon");
  17. when(mockedEdr.getNameById(0)).thenReturn("Amit");
  18. when(mockedEdr.getNameById(1)).thenReturn("Anupam");
  19. when(mockedEdr.getNameById(2)).thenReturn("Chirag");
  20. when(mockedEdr.getNameById(3)).thenReturn("Rashmi");
  21. when(mockedEdr.count()).thenReturn(4L);
  22. }
  23. @Test
  24. public void testCreateShiftPlan() {
  25. sps.createShiftPlan(4, 1, 2020);
  26. verify(mockedSpr, times(36)).save(any(ShiftPlan.class));
  27. verifyNoMoreInteractions(mockedSpr);
  28. }
  29. }

application.properties 档案如下-

  1. server.port=8104
  2. number_of_days.last= 7
  3. number_of_months.plan= 2
  4. spring.datasource.url=<<sensitive info>>
  5. spring.datasource.username=<sensitive info>
  6. spring.datasource.password=<sensitive info>
  7. # Keep the connection alive while idle for a long time
  8. spring.datasource.testWhileIdle= true
  9. spring.datasource.validationQuery= SELECT 1
  10. # Show or not log for each sql query
  11. spring.jpa.show-sql = true
  12. # Hibernate ddl auto (create, create-drop, update)
  13. spring.jpa.hibernate.ddl-auto = update
  14. # Naming strategy
  15. spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
  16. # Use spring.jpa.properties.* for Hibernate native properties (the prefix is
  17. # stripped before adding them to the entity manager)
  18. # The SQL dialect makes Hibernate generate better SQL for the chosen database
  19. spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect

在ShiftPlanService类中,我有

  1. @Value("${number_of_days.last}")
  2. public int ndl;
  3. @Value("${number_of_months.plan}")
  4. public int nm;
8zzbczxx

8zzbczxx1#

我认为您打算使用ShiftPlanService的一个真实示例并注入模拟。您需要让Spring自动将ShiftPlanService连接到您的测试中,并告诉它注入模拟,如下所示:

  1. @Autowired
  2. @InjectMocks
  3. ShiftPlanService sps;

尽管你可以考虑在你的设置方法中自己示例化ShiftPlanService,然后传递你的模拟并设置ShiftPlanService上的其他属性。

xwmevbvl

xwmevbvl2#

您混淆了Mockito注入和Spring注入。@Value是Spring的概念,只有在Spring管理bean时才会被注入,但是您在测试中拥有的ShiftPlanService的示例是由Mockito使用@Spy注入的(正如已经指出的,您实际上并不需要)。
我的建议是决定你想要什么--一个带模拟的单元测试,还是一个运行应用程序上下文的成熟的Spring测试。在我看来,你的意图是写一个带所有模拟的单元测试,在这种情况下:

  • 删除@ContextConfiguration@TestPropertySource(单元测试不需要它们)
  • ShiftPlanService sps上使用@InjectMocks而不是@Spy-它很可能会执行您想要的操作,这取决于ShiftPlanService的实现方式
  • sps中手动设置所需的配置值;您可以为测试要使用的setter添加setter;如果单元测试和类在同一个包中--这是一个很好的实践--它们也可以是包私有的--因为在生产中Spring会自动为您连接它们,所以您只需要它们用于测试
  • 哦,请将@Value注解保留在ShiftPlanService中-生产需要它-如上所述
jm81lzqq

jm81lzqq3#

我们发明了一个Mockito扩展,它允许简单地注入String/Integer/Boolean属性。
https://github.com/exabrial/mockito-object-injection

相关问题