Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Spring Boot中使用模拟存储库测试void服务方法?_Java_Spring_Spring Boot_Unit Testing_Spring Test - Fatal编程技术网

Java 在Spring Boot中使用模拟存储库测试void服务方法?

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失败

我的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来自哪个来源? } }
在调用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