在下面的测试代码片段中,无法从配置文件中提取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;
3条答案
按热度按时间8zzbczxx1#
我认为您打算使用ShiftPlanService的一个真实示例并注入模拟。您需要让Spring自动将ShiftPlanService连接到您的测试中,并告诉它注入模拟,如下所示:
尽管你可以考虑在你的设置方法中自己示例化ShiftPlanService,然后传递你的模拟并设置ShiftPlanService上的其他属性。
xwmevbvl2#
您混淆了Mockito注入和Spring注入。
@Value
是Spring的概念,只有在Spring管理bean时才会被注入,但是您在测试中拥有的ShiftPlanService
的示例是由Mockito
使用@Spy
注入的(正如已经指出的,您实际上并不需要)。我的建议是决定你想要什么--一个带模拟的单元测试,还是一个运行应用程序上下文的成熟的Spring测试。在我看来,你的意图是写一个带所有模拟的单元测试,在这种情况下:
@ContextConfiguration
和@TestPropertySource
(单元测试不需要它们)ShiftPlanService sps
上使用@InjectMocks
而不是@Spy
-它很可能会执行您想要的操作,这取决于ShiftPlanService
的实现方式sps
中手动设置所需的配置值;您可以为测试要使用的setter添加setter;如果单元测试和类在同一个包中--这是一个很好的实践--它们也可以是包私有的--因为在生产中Spring会自动为您连接它们,所以您只需要它们用于测试@Value
注解保留在ShiftPlanService
中-生产需要它-如上所述jm81lzqq3#
我们发明了一个Mockito扩展,它允许简单地注入String/Integer/Boolean属性。
https://github.com/exabrial/mockito-object-injection