让我们假设我有两个课:
TodoRepository
是一个简单的CRUD存储库:
public interface TodoRepository extends CrudRepository<T, ID> {
}
TodoService
只是一个调用此存储库的类:
@Service
public class TodoService{
private final TodoRepository todoRepository;
@Autowired
public TodoService(TodoRepository todoRepository) {
this.todoRepository = todoRepository;
}
public void createTodo(Todo todo) {
todoRepository.save(todo);
}
}
我应该麻烦测试服务层吗?
编辑:
感谢@Dherik的解释。我创建了一个测试类,如下所示:
注意:我正在使用JUnit5,Mockito和Spring框架
@ExtendWith(SpringExtension.class)
class TodoServiceTest {
@MockBean
private TodoRepository todoRepository;
private TodoService todoService;
@BeforeEach
void setUp() {
todoService = new TodoService(todoRepository);
}
@AfterEach
void tearDown() {
clearInvocations(tanklevelRepository);
}
@Test
public void createTodo() {
todoService.createTodo(new Todo());
// verify if the save method is called when createTodo is called too
verify(todoRepository, times(1)).save(any(Todo.class));
}
}
答案 0 :(得分:2)
是的,很重要。
即使现在是一个非常简单的类,也许是一些开发人员,将来都可能会在此方法createTodo
上添加一些奇怪的条件,即Todo
将不再保存。
如果您为实际方法编写测试,以验证是否调用save
,则如果开发人员进行了一些影响Todo
保存的更改,则会被告知开发人员情况。
查看伪测试示例:
@Test
public void createTodo() {
TodoRepository todoRepository = mock(TodoRepository.class);
TodoService todoService = new TodoService(todoRepository);
todoService.createTodo(new Todo());
// verify if the save method is called when createTodo is called too
verify(todoRepository, times(1)).save(any(Todo.class));
}
答案 1 :(得分:0)
我已经看到这种东西使用Junit使用Mock框架进行了测试,并将模拟回购注入服务,然后调用了模拟回购。对我来说,这似乎毫无意义,因为测试对实现的了解太多。如果您更改实现,则必须重写测试,因此它对重构没有用。
我将通过将应用程序像黑盒子一样对待的集成测试来测试这种事情。即启动应用程序,触发创建待办事项的所有内容并检查其是否已创建。我可能会使用Cucumber-jvm,并有一个场景,其中包含一个步骤来创建待办事项,另一个步骤来检索待办事项。
我认为您应该创建测试