Java 在Spring Boot中使用模拟存储库测试void服务方法?
我的Spring启动应用程序提供以下服务,它增加用户实体上的一个计数器,并将其持久化到数据库 @服务 公共类MyService{ @自动连线 UserRepo UserRepo; public void incrementLoginFailuresString电子邮件引发UserNotFoundException{ 最终用户=userRepo.findByEmailemail.orElseThrowUserNotFoundException::new; user.incrementLogin失败; userRepo.saveuser; } } 现在,我想为此编写一个JUnit5测试,更喜欢模拟respository,但我想我在理解模拟的概念时有些困难 如您所见,服务方法incrementLoginFailures没有返回任何内容,因此我不知道如何检查用户实体上的登录计数器是否实际增加了。我是否需要为这种检查编写一个集成测试,这种检查实际上会启动数据库 @ExtendWithMockitoExtension.class 公共类UserServiceTest{ @注射模拟 私人用户服务; @嘲弄 私人用户回购用户回购; @试验 公共空间应该增加{ 用户服务。incrementLoginFailuresfoo@bar.com; Assertions.assertEquals1,xyz;//xyz来自哪个来源? } }Java 在Spring Boot中使用模拟存储库测试void服务方法?,java,spring,spring-boot,unit-testing,spring-test,Java,Spring,Spring Boot,Unit Testing,Spring Test,我的Spring启动应用程序提供以下服务,它增加用户实体上的一个计数器,并将其持久化到数据库 @服务 公共类MyService{ @自动连线 UserRepo UserRepo; public void incrementLoginFailuresString电子邮件引发UserNotFoundException{ 最终用户=userRepo.findByEmailemail.orElseThrowUserNotFoundException::new; user.incrementLogin失败
在调用userService之前在测试方法中。incrementLoginFailuresfoo@bar.com; 您需要模拟在userRepo上调用的方法的返回值,如下所示:
@ExtendWith(MockitoExtension.class)
public class UserServiceTest {
@InjectMocks
private UserService userService;
@Mock
private UserRepo userRepo;
@Test
public void shouldIncrement() {
User user = new User();//please initialize as per your requirement
when(userRepo.findByEmail("foo@bar.com")).thenReturn(user);
userService.incrementLoginFailures("foo@bar.com");//this method will make changes to the user object
Assertions.assertEquals(1, user.getLoginFailures());
}
}
在调用userService之前在测试方法中。incrementLoginFailuresfoo@bar.com; 您需要模拟在userRepo上调用的方法的返回值,如下所示:
@ExtendWith(MockitoExtension.class)
public class UserServiceTest {
@InjectMocks
private UserService userService;
@Mock
private UserRepo userRepo;
@Test
public void shouldIncrement() {
User user = new User();//please initialize as per your requirement
when(userRepo.findByEmail("foo@bar.com")).thenReturn(user);
userService.incrementLoginFailures("foo@bar.com");//this method will make changes to the user object
Assertions.assertEquals(1, user.getLoginFailures());
}
}
我建议从方法返回用户对象以帮助测试。要设置模拟存储库行为,请使用Mockito.when并返回新用户POJO。然后在返回的对象上断言登录失败计数为1。我建议从方法中返回用户对象以帮助测试。要设置模拟存储库行为,请使用Mockito.when并返回新用户POJO。然后在返回的对象上断言登录失败计数为1。您应该只测试自己的代码,并在单元测试中测试该单元的代码。因此,如果SpringDataRepositorySave起作用,就不是这样了。你可以测试它,但你应该相信它是有效的 如果操作正确,您应该有一个单元测试来断言user.incrementLoginFailures可以正常工作
// Unit test for the user
@Test
public void shouldIncrement() {
User user = new User();
// In here when you have just initialized user you might know that
// the initial count is zero but it is overall better to assert
// the logic for any value / case
int originalLoginFailures = user.getLoginFailures();
user.incrementLoginFailures();
assertEquals(originalLoginFailures + 1, user.getLoginFailures());
}
除了数据保存到数据库之外,这实际上是您需要知道的
所以你可能有一个UserService的单元测试,或者是MyService?它断言为使用电子邮件的用户调用userIncrementLoginFailures和userRepo.savefoo@bar.com当用户使用服务时。incrementLoginFailuresfoo@bar.com被称为
这将通过验证完成,例如:
您可以测试该用户。incrementLoginFailures也可以在这里工作,但因为您在用户单元测试中测试了它,所以它不一定需要,而是一个冗余测试,测试不属于单元测试的逻辑,即UserService。您应该只测试您自己的代码,并在单元测试中测试该单元的代码。因此,如果SpringDataRepositorySave起作用,就不是这样了。你可以测试它,但你应该相信它是有效的 如果操作正确,您应该有一个单元测试来断言user.incrementLoginFailures可以正常工作
// Unit test for the user
@Test
public void shouldIncrement() {
User user = new User();
// In here when you have just initialized user you might know that
// the initial count is zero but it is overall better to assert
// the logic for any value / case
int originalLoginFailures = user.getLoginFailures();
user.incrementLoginFailures();
assertEquals(originalLoginFailures + 1, user.getLoginFailures());
}
除了数据保存到数据库之外,这实际上是您需要知道的
所以你可能有一个UserService的单元测试,或者是MyService?它断言为使用电子邮件的用户调用userIncrementLoginFailures和userRepo.savefoo@bar.com当用户使用服务时。incrementLoginFailuresfoo@bar.com被称为
这将通过验证完成,例如:
您可以测试该user.incrementLoginFailures也可以在这里工作,但因为您在用户单元测试中测试了它,所以不一定需要它,而是一个冗余测试,并且测试不属于单元测试的逻辑,即UserService