我有一个简单的JavaSpringRESTAPI应用程序,我不知道如何对它进行单元测试。我读过JUnit和Mockito的纪录片,但我想不出来。
下面是StudentController类中的post方法
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public void insertStudent(@RequestBody Student student){
studentService.insertStudent(student);
}
这是在学生服务类中的插入学生方法
public void insertStudent(Student student) {
studentDao.insertStudent(student);
}
我使用MySQL作为数据库。我应该在单元测试中也使用数据库吗?我的意思是我不想要任何集成测试。我只需要单元测试。我在节点中使用supertest。js和它照顾所有人,我可以用JUnit或Mockito也这样做吗?
您希望模拟studentService
,并进行单元测试,以验证当调用API的方法insertStudent(Student)
时,使用相同的Student
实例调用服务的insertStudent(Student)
。
然后为不同的场景创建单元测试,即处理null
s等。。
我有一个简单的JavaSpringRESTAPI应用程序
你应该早点开始考虑单元测试。最好的方法是在生产代码实现(新)行为(TDD)之前执行这些操作。
下面是StudentController类中的post方法
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public void insertStudent(@RequestBody Student student){
studentService.insertStudent(student);
}
这段代码太简单了,不能失败。为这样的代码编写单元测试需要很长的时间。这样的代码是通过应用程序或模块测试来测试的
一旦有决定要做(例如:根据输入参数对其他对象进行额外调用),我就会开始为此代码编写单元测试。
这里的要点是单元测试不测试代码-单元测试验证所需的行为(在您的需求中表示)。因此,是的:不测试此方法会降低报告中的覆盖率。但是任何覆盖率工具计算的数量都不如需求覆盖率重要,因为没有工具可以计算需求覆盖率,而您只能通过TDD来保证需求覆盖率。
如果您想进行单元测试,那么就不必连接到数据库。连接到DB和其他外部服务将被视为集成测试。因此,在测试StudentService
类时,对数据库的请求将被模拟出来。
第二点值得一提的是,您将分别测试控制器类和服务类,但在您的情况下,这些测试看起来非常相似。
下面是测试控制器的insertstrudent
方法的一种方法。
@RunWith(MockitoJUnitRunner.class)
public class TestStudentContoller {
@Mock
StundentService mockStudentService;
@InjectMocks
StudentController studentController = new StudentController();
@Test
public void testInsertStudent(){
Student student = new Student();
studentContoller.insertStudent(student);
verify(studentService, times(1)).insertStudent(student);
}
由于控制器的insertStudent
方法没有if语句,只有一个分支,因此基本上只需要执行一个测试,控制器基本上调用服务。
另一种测试方法是使用SpringsMockMvc
。MockMvc
的好处在于它允许您测试HTTP请求。例如,在本例中,您需要测试控制器的insertStudent
方法是否能够正确地使用JSON学生响应HTTP POST请求。
@RunWith(MockitoJUnitRunner.class)
public class TestStudentContoller {
@Mock
StundentService mockStudentService;
@InjectMocks
StudentController studentController = new StudentController();
MockMvc mockMvc;
@Before
public void setup(){
mockMvc = MockMvcBuilders.standAloneSetup(studentController).build();
}
@Test
public void testInsertStudent(){
Student student = new Student();
studentContoller.insertStudent(student);
mockMvc.perform(post("path/to/insert/student")
.accept(MediaType.APPLICATION_JSON)
.andExpect(status().isOk())
.andExpect(content().string("{}"));//put json student in here
verify(studentService, times(1)).insertStudent(student);
}
MockMvc
还有其他很酷的方法,你应该去探索。
我不完全确定这是否是适合这种问题的地方,但我会试着至少花几分钟来摆脱他们称之为Spring靴测试的地狱。 我正在寻找任何关于测试的最新信息资源(书籍/网站等)。 我是java/kotlin开发人员,现在已经进入第四个年头了,我觉得自己对java/kotlin和Spring Boot软件的理解还不错。但有一个类别让我感到震惊。测试、单元和Rest。 无论出于什么原因,每次我尝试进行新的测试或更新旧的
问题内容: 我想为一些连接到数据库,运行一个或多个查询然后处理结果的代码编写一些单元测试。(实际上没有使用数据库) 这里的另一个开发人员编写了我们自己的DataSource,Connection,Statement,PreparedStatement和ResultSet实现,这些实现将基于xml配置文件返回相应的对象。(我们可以使用伪造的数据源,并针对返回的结果集运行测试)。 我们在这里重新发明轮
我已经为我的应用程序编写了自定义的JsonSerializer和JsonDeserializer。现在我想为它们编写一些单元测试。
我正在用Groovy开发,并试图为以下使用Spring的RestTemplate编写一个Spock单元测试... 其中包括我的请求回调和响应提取器,以及我的RestTemplate bean的初始化类。我正在使用ResponseExtractor将来自的响应流化,并将其复制到一个文件中。RequestCallback只是在请求上设置一些头。 特定方法的Spring框架文档:https://docs
问题内容: 我的公司一直在评估Spring MVC,以确定我们是否应该在下一个项目中使用它。到目前为止,我喜欢我所看到的内容,现在,我正在查看Spring Security模块,以确定是否可以/应该使用它。 我们的安全要求非常基本。用户只需要能够提供用户名和密码即可访问网站的某些部分(例如获取有关其帐户的信息);并且网站上的页面很少(常见问题解答,支持等),应该为匿名用户提供访问权限。 在我创建的
问题内容: 如何在单元测试中测试 hashCode()函数? 问题答案: 每当我覆盖equals和hash代码时,我都会按照Joshua Bloch在“ Effective Java”第3章中的建议编写单元测试。我确保equals和hash代码是自反的,对称的和可传递的。我还确保“不等于”对所有数据成员均正常工作。 当我检查对equals的调用时,我还要确保hashCode的行为符合预期。像这样: