我已经为服务和控制器编写了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 层。 我错过了什么吗?当我尝试模拟服务时,控制器也发生了同样的情况,它调用服务类的实际方法。
这个测试不需要启动整个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();
}
}
尝试在 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();
}
}