Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.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 如何使用Mockito将void方法测试到服务类中?_Java_Spring_Unit Testing_Testing_Mockito - Fatal编程技术网

Java 如何使用Mockito将void方法测试到服务类中?

Java 如何使用Mockito将void方法测试到服务类中?,java,spring,unit-testing,testing,mockito,Java,Spring,Unit Testing,Testing,Mockito,我需要通过我的所有测试,并达到我的项目的所有类的完整代码覆盖率 我创建了一个存储库、服务和控制器类 我需要将所有单个方法测试到这些类中 我有以下课程: 1个带ApplicationController测试的ApplicationController 2带UserServiceTest的UserService 3带有UserRepositoryTest的UserRepository 这是控制器: @Controller @RequestMapping("/") @SessionA

我需要通过我的所有测试,并达到我的项目的所有类的完整代码覆盖率

我创建了一个存储库、服务和控制器类

我需要将所有单个方法测试到这些类中

我有以下课程: 1个带ApplicationController测试的ApplicationController 2带UserServiceTest的UserService 3带有UserRepositoryTest的UserRepository

这是控制器:

 @Controller
    @RequestMapping("/")
    @SessionAttributes("user")
    public class ApplicationWebController {

    @Autowired
    private UserService userService;

    @Autowired
    private FundService fundService;

    @PostMapping("/save-user")
    public String saveUser(User user, Model model) {
        final User presentUsername = 
    userService.getUserByUsername(user.getUsername());
        if (presentUsername == null) {
            userService.insertNewUser(user);
            if((user.getUsername()).equals("admin")) {
                userService.updateRoleToAdmin(user.getId());
            }
    }
@RunWith(SpringRunner.class)
@WebMvcTest(controllers = ApplicationWebController.class)
public class ApplicationWebControllerTest {

@Autowired
private WebClient webClient;

@MockBean
private UserService userService;

@Test
public void test_whenInsertedUserIsAdmin_DoUpdateOnRole() throws 
Exception {

User userInserted = new User(1L, "admin", "password", 1);       

mvc.perform(post("/save-user")
        .param("id", "1")
        .param("username", "admin")
        .param("password", "password")
        .param("role", "1"));

if (userInserted.getUsername() == "admin") {
    verify(userService).updateRoleToAdmin(1L);
}
}
}
这里我插入一个新用户;如果User.username等于admin,那么我将使用userService.updateRoletLoadMinuser.getId更新字段角色

这是控制器的JUnit测试:

 @Controller
    @RequestMapping("/")
    @SessionAttributes("user")
    public class ApplicationWebController {

    @Autowired
    private UserService userService;

    @Autowired
    private FundService fundService;

    @PostMapping("/save-user")
    public String saveUser(User user, Model model) {
        final User presentUsername = 
    userService.getUserByUsername(user.getUsername());
        if (presentUsername == null) {
            userService.insertNewUser(user);
            if((user.getUsername()).equals("admin")) {
                userService.updateRoleToAdmin(user.getId());
            }
    }
@RunWith(SpringRunner.class)
@WebMvcTest(controllers = ApplicationWebController.class)
public class ApplicationWebControllerTest {

@Autowired
private WebClient webClient;

@MockBean
private UserService userService;

@Test
public void test_whenInsertedUserIsAdmin_DoUpdateOnRole() throws 
Exception {

User userInserted = new User(1L, "admin", "password", 1);       

mvc.perform(post("/save-user")
        .param("id", "1")
        .param("username", "admin")
        .param("password", "password")
        .param("role", "1"));

if (userInserted.getUsername() == "admin") {
    verify(userService).updateRoleToAdmin(1L);
}
}
}
这项测试正确地通过了

现在我有了服务类和相关的测试类

这是服务班

@Service
public class UserService {

private UserRepo userRepo;

public void updateRoleToAdmin(Long id) {
    userRepo.updateRoleToAdmin(id);
}
}
这个类也必须经过测试,这是服务的JUnit类

@RunWith(MockitoJUnitRunner.class)
public class UserServiceTest {

@Mock
private UserRepo userRepo;

@InjectMocks
private UserService userService;

@Test
public void test_updateRoleToAdmin() {
//I DON'T KNOW HOW WRITE HERE
        //I NEED TO TEST THE RESPECTIVE METHOD IN SERVICE CLASS
        //THE METHOD IN userRepo IS A VOID METHOD 
}
}
这些是我的存储库类和JUnit测试

public interface UserRepo extends JpaRepository<User, Long> {

@Modifying(flushAutomatically = true, clearAutomatically = true)
@Transactional
@Query("update User u set u.role = 2 where u.id = :userid")
void updateRoleToAdmin(@Param("userid") Long id);

}
此外,该测试正确通过

现在,我必须在UserServiceTest JUnit测试类中编写一个测试

我不知道该怎么办,因为这是一个无效的方法,我不能使用whenmethod.thenReturn。。下面的断言

我的所有类的代码覆盖率必须达到100%,如果不测试UserService.updateRoletLoadMinLong id方法,我就无法访问它

请帮忙,因为我不知道如何在那里测试void方法

多谢各位。 我需要通过我的所有测试,并达到我的项目的所有类的完整代码覆盖率

我创建了一个存储库、服务和控制器类


我需要将所有单个方法测试到这些类中。

您应该测试SUT方法内部发生的事情。您已经模拟了回购协议,因此只需验证测试中的行为:

@Test
public void shouldUpdateRoleToAdmin() {
    // When
    userService.updateRoleToAdmin(anyLong());

    // Then
    verify(userRepo, times(1)).updateRoleToAdmin(anyLong()); 
}

在您使用特定id调用该方法之后。

我尝试过,但测试没有通过。失败:需要但未调用:userRepo.UpdateRoletLoadMin1l;->在com.crowdfunding.service.UserServiceTest.test_UpdateRoletLoadMinUserServiceTest.java:28上,实际上,与该模拟的交互为零。我尝试了两种方法:1验证UserRepo,times1.UpdateRoletLoadMinAnyLong;2用户=新用户1L,管理员,密码,1;verifyuserRepo,times1.UpdateRoletLoadMinUser.getId;您在验证之前调用过服务方法吗?现在我添加了userService.updateRoletLoadMinAnyLong;而且很有效!!!非常感谢你