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

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

在下面的测试代码片段中,无法从配置文件中提取number_of_days.last和number_of_months.plan的值。请检查原因。当我从服务类www.example.com中删除@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=<<sensitive info>>
spring.datasource.username=<sensitive info>
spring.datasource.password=<sensitive info>

# 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;
8zzbczxx

8zzbczxx1#

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

@Autowired
@InjectMocks
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

相关问题