无法在服务类中模拟dao

问题描述 投票:0回答:2

我已经为服务和控制器编写了junit 5,但我无法模拟服务和dao。它调用service和dao类的实际方法。

@SpringBootTest(classes = {UserService.class})
@ExtendWith(MockitoExtension.class)
@ImportAutoConfiguration(RefreshAutoConfiguration.class)
public class UserServiceTest {

    @Autowired
    UserService service;

    @MockBean
    private ReadDao readDao;

    @Test
    public void getDataTest() {

        Map<String, User> userMap = new HashMap<>();
        userMap.put("Admin", new User(1,"john"));
        when(readDao.getData(any())).thenReturn(userMap);

       User user = service.getUserData();
    }
}

用户服务

@Component
public class UserService {

    @Autowired
    private ReadDao readDao;

    @Value("${app.user.role}")
    private String role;

    public User getUserData() {
        User user = null;
        try {
            user = readDao.getData("name");
        } catch (DataNotFoundException e) {
            //do nothing. return empty 
        }
        return user;
    }
}

@MockBean 不是创建模拟对象,它创建实际对象,因此调用转到 dao 层。 我错过了什么吗?当我尝试模拟服务时,控制器也发生了同样的情况,它调用服务类的实际方法。

java spring-boot mockito junit5 junit-jupiter
2个回答
0
投票

这个测试不需要启动整个Spring上下文。这应该是一个简单、直接的 Mockito 测试:

@ExtendWith(MockitoExtension.class)
public class UserServiceTest {

    @InjectMocks
    UserService service;

    @Mock
    private ReadDao readDao;

    @Test
    public void getDataTest() {

        Map<String, User> userMap = new HashMap<>();
        userMap.put("Admin", new User(1,"john"));
        when(readDao.getData(any())).thenReturn(userMap);

       User user = service.getUserData();
    }
}

0
投票

尝试在 UserService 中通过构造函数而不是 Autowire 注入依赖项,然后你可以编写一个简单的 junit 测试,而无需加载整个 spring 上下文

@Component
@RequiredArgsConstructor
public class UserService {

    private ReadDao readDao;

    @Value("${app.user.role}")
    private String role;

    public User getUserData() {
        User user = null;
        try {
            user = readDao.getData("name");
        } catch (DataNotFoundException e) {
            //do nothing. return empty 
        }
        return user;
    }
}

现在你的测试类将如下所示

@ExtendWith({MockitoExtension.class})
public class UserServiceTest {
    @InjectMocks
    UserService service;

    @Mock
    private ReadDao readDao;

    @Test
    public void getDataTest() {

        Map<String, User> userMap = new HashMap<>();
        userMap.put("Admin", new User(1,"john"));
        when(readDao.getData(any())).thenReturn(userMap);

       User user = service.getUserData();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.