我有这个类定义
@RestController
public class ReservationController {
@Autowired
private Reservation reservation;
@RequestMapping(value = "/reservation", produces = MediaType.APPLICATION_JSON_UTF8_VALUE, method = RequestMethod.POST)
@ResponseBody
public Reservation getReservation() {
return reservation;
}
}
其中保留是一个简单的Pojo
public class Reservation {
private long id;
private String reservationName;
public Reservation() {
super();
this.id = 333;
this.reservationName = "prova123";
}
public Reservation(long id, String reservationName) {
super();
this.id = id;
this.reservationName = reservationName;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getReservationName() {
return reservationName;
}
public void setReservationName(String reservationName) {
this.reservationName = reservationName;
}
@Override
public String toString() {
return "Reservation [id=" + id + ", reservationName=" + reservationName + "]";
}
}
@WebMvcTest
@RunWith(SpringRunner.class)
public class MvcTest {
@Autowired
private MockMvc mockMvc;
@MockBean(name = "reservation")
private Reservation reservation;
@Test
public void postReservation() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.post("/reservation"))
.andExpect(MockMvcResultMatchers.content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE))
.andExpect(MockMvcResultMatchers.status().isOk());
}
}
........
原因:com.fasterxml.jackson.databind.exc.InvalidDefinitionException:找不到类org.mockito.internal.debugging.locationImpl的序列化程序,也找不到创建BeanSerializer的属性(若要避免异常,请禁用SerializationFeature.fail_on_empty_beans)(通过引用链:spring.boot.usingspringboot.entity.reservation$mockitomock$980801978[“mockitointerceptor”]->
如何才能以正确的方式注入预订??
谢谢你
之所以会出现错误,是因为当您使用@mockbean
(或在非Spring环境中使用@mock
)时,您会得到一个Mockito模拟对象。该对象是您的对象的空心代理。代理具有与您的类相同的公共方法,默认情况下返回其返回类型的默认值(例如,对象为null,int为1,等等),或者对void方法不执行任何操作。
杰克逊正在抱怨,因为它要连载这个没有字段的代理,杰克逊不知道该怎么做。
com.fasterxml.jackson.databind.exc.InvalidDefinitionException:找不到org.mockito.internal.debugging.LocationImpl类的序列化程序,也找不到创建BeanSerializer的属性(若要避免异常,请禁用SerializationFeature.fail_on_empty_beans
通常,当模拟某个要测试的类的依赖项时,模拟的是在所测试的类中使用的公共方法。直接返回依赖项并不是一个好的真实世界用例--您不太可能必须编写这样的代码。
我想您正在尝试学习,所以让我提供一个改进的示例:
@RestController
public class ReservationController {
@Autowired
private ReservationService reservationService; //my chnage here
@RequestMapping(value = "/reservation", produces = MediaType.APPLICATION_JSON_UTF8_VALUE, method = RequestMethod.POST)
@ResponseBody
public Reservation getReservation() {
return reservationService.getReservation(); //my chnage here
}
}
通常不是直接注入值对象,而是使用包含一些业务逻辑并返回某些内容的服务类--在我的示例中,ReservationService
有一个方法getReservation()
返回Reservation
和类型为Reservation
的对象。
这样,在测试中就可以模拟reservationservice
。
@WebMvcTest
@RunWith(SpringRunner.class)
public class MvcTest {
@Autowired
private MockMvc mockMvc;
@MockBean(name = "reservation")
private ReservationService reservationService; //my chnage here
@Test
public void postReservation() throws Exception {
// You need that to specify what should your mock return when getReservation() is called. Without it you will get null
when(reservationService.getReservation()).thenReturn(new Reservation()); //my chnage here
mockMvc.perform(MockMvcRequestBuilders.post("/reservation"))
.andExpect(MockMvcResultMatchers.content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE))
.andExpect(MockMvcResultMatchers.status().isOk());
}
}
22.13.5.测试检测 测试任务检测哪些类是通过检查编译测试类的测试类。默认情况下它会扫描所有.calss文件.可以自定义包含/排除哪些类需不要要被扫描.所使用不同的测试框架(JUnit/ TestNG)时测试类检测使用不同的标准。 当使用JUnit,我们扫描的JUnit3和JUnit4的测试类。如果任一下列条件匹配,类被认为是一个JUnit测试类: 类或父类集成自TestCase或Groovy
22.13.2.调试 测试任务提供了Test.getDebug()属性,可使JVM等待调试器附加到5005端口后在进行调试. 通过调用--debug-JVM任务选项,这也可以启用调试任务(since Gradle1.12)。
程序测试是一种找到缺陷的有效方式,但是它对证明没有缺陷却无能为力。 Edsger W. Dijkstra, “The Humble Programmer” (1972) 作为软件工程质量保障体系的重要一环,测试是应该引起我们充分注意并重视的事情。前面说过,Rust 语言的设计集成了最近十多年中总结出来的大量最佳工程实践,而对测试的原生集成也正体现了这一点。下面来看 Rust 是怎么设计测试特性的。
import counter from './counter'; describe('counter reducers', () => { it('should handle initial state', () => {
下面的示例会为您测试Redux应用程序打下坚实的基础。
就像 会编译代码并运行生成的二进制文件一样,cargo test 在测试模式下编译代码并运行生成的测试二进制文件。可以指定命令行参数来改变 cargo test 的默认行为。例如,cargo test 生成的二进制文件的默认行为是并行的运行所有测试,并捕获测试运行过程中产生的输出避免他们被显示出来,使得阅读测试结果相关的内容变得更容易。 这些选项的一部分可以传递给 cargo test,而另一些则
测试用来验证非测试的代码是否按照期望的方式运行的 Rust 函数。测试函数体通常执行如下三种操作: 设置任何所需的数据或状态 运行需要测试的代码 断言其结果是我们所期望的 让我们看看 Rust 提供的专门用来编写测试的功能:test 属性、一些宏和 should_panic 属性。 作为最简单例子,Rust 中的测试就是一个带有 test 属性注解的函数。属性(attribute)是关于 Rust
22.13.7.测试报告 测试任务默认生成以下结果. 一份HTML测试报告 一个与Ant的JUnit测试报告任务兼容的XML.这个格式与许多其他服务兼容,如CI serves 结果是有效的二进制,测试任务会从这些二进制结果生成其他结果。 有一个独立的TestReport任务类型会根据一些Test任务实例生成的二进制源码生成一个HTML报告.使用这种测试类型,需要定义一个destinationDir