首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在尝试用ObjectMapper测试方法时为类找到无序列化程序

在尝试用ObjectMapper测试方法时为类找到无序列化程序
EN

Stack Overflow用户
提问于 2022-09-15 12:02:44
回答 1查看 163关注 0票数 0

我得到了这个异常- java.lang.IllegalArgumentException: No serializer found for class org.mockito.internal.creation.bytebuddy.ByteBuddyCrossClassLoaderSerializationSupport and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: org.mockito.codegen.Object$MockitoMock$["mockitoInterceptor"]->org.mockito.internal.creation.bytebuddy.MockMethodInterceptor["serializationSupport"])

我正在编写的Testcase如下所示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Mock
Object object;

@Mock
ResponseType response;

@Test
public void handleRequest() {
    ObjectMapper mapper = new ObjectMapper();
    when(mapper.convertValue(object, ResponseType.class)).thenReturn(response)
    new Handler().handleRequest(object);
}

我试着测试的方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Handler{

    public ResponseType handleRequest(Object object) {
        ObjectMapper mapper = new ObjectMapper();
        ResponseType response = mapper.convertValue(object, ResponseType.class);
        return response;
    }
}

我看到我可以禁用SerializationFeature.FAIL_ON_EMPTY_BEANS,但是我无法控制基类,我只能编写一个测试用例。有人能告诉我我做错了什么,以及我能给测试用例添加什么吗?我无法在测试用例中实例化一个ObjectMapper,因为它必须是一个模拟,我尝试在ObjectMapper上使用一个间谍并禁用SerializationFeature.FAIL_ON_EMPTY_BEANS,但两者都不起作用。我对Mockito也很陌生,所以我不知道怎样才能继续前进。任何帮助都将不胜感激,谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-15 22:58:16

测试代码有两个问题。您正在调用真正的ObjectMapper方法,而不是模拟它(1),并且在实际代码(2)中没有使用创建的对象(尽管它不是一个模拟)。

在下面的行中(我添加了换行符和注释,但与代码相同),您正在创建ObjectMapper的实例(而不是模拟),在尝试模拟它的行为时,实际上调用了创建对象的真正方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ObjectMapper mapper = new ObjectMapper();
when(
    // here an actual convertValue method is called on the mapper object
    // which causes the exception you're getting
    mapper.convertValue(object, ResponseType.class)
).thenReturn(response)

如果您使用的方法不是在模拟时调用实际方法(在使用间谍时很有用):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
doReturn(response)
        .when(mapper)
        .convertValue(object, ResponseType.class);

您仍然会得到一个错误,但这一次是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
org.mockito.exceptions.misusing.NotAMockException: 
Argument passed to when() is not a mock!
Example of correct stubbing:
    doThrow(new RuntimeException()).when(mock).someMethod();

这是因为您正在创建的mapper不是一个Mockito模拟/间谍,所以它不能被模仿。要解决需要使用mock(...)方法或@Mock注释(记得初始化/打开它们)的问题,请执行以下操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ObjectMapper mapper = mock(ObjectMapper.class);
when(mapper.convertValue(object, ResponseType.class))
        .thenReturn(response);

现在,您得到的初始错误和NotAMockException都没有抛出,但是模拟没有任何效果。

在您的实际代码中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public ResponseType handleRequest(Object object) {
    ObjectMapper mapper = new ObjectMapper();
    ...
}

您正在使用ObjectMapper创建new。这个对象根本没有连接到在测试中创建的模拟-它没有被注入。要解决这个问题,最好将ObjectMapper实例存储在字段中,并使用类创建(注入)初始化它--无论是在实际代码中还是在测试中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Handler {

    private ObjectMapper objectMapper;

    Handler(ObjectMapper objectMapper) {
        this.objectMapper = objectMapper;
    }
    
    public ResponseType handleRequest(Object object) {
        // use the objectMapper here
    }
}

因此,您可以将测试中的模拟ObjectMapper传递给测试对象构造函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Test
public void handleRequest() {
    ObjectMapper mapper = mock(ObjectMapper.class);
    when(mapper.convertValue(object, ResponseType.class)).thenReturn(response);

    new Handler(mapper).handleRequest(object);
}

其他方法可以是使用提供ObjectMapper的工厂,也可以在测试中模拟,或者(不推荐)使用Mockito -与它的mockConstruction方法(自从Mockito 3.5.0)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73736799

复制
相关文章
测试思想-测试设计 测试用例设计之等价类划分方法
把所有可能的输入数据,即程序的输入域划分成若干部分(子集),然后从每一个子集中选取少数具有代表性的数据作为测试用例。该方法是一种重要的,常用的黑盒测试用例设计方法。
授客
2019/09/11
1.4K0
测试思想-测试设计 测试用例设计之等价类划分方法
测试用例方法
等价类划分 是把所有可能输入的数据分为若干个区域,然后从每个区域中取少量有代表性的数据进行测试即可。
派大星在吗
2021/12/06
7070
测试用例的设计方法:等价类划分法[通俗易懂]
常见测试用例的设计方法有八种,下图中标红的是需要掌握的。优先级从等价类划分法,边界值分析法方向排序。每种设计方法,我都会分析,今天我们先一起看看什么是等价类划分法。
全栈程序员站长
2022/11/02
8250
黑盒测试用例测试方法
等价类划分法是一种典型的、重要的黑盒测试方法,是指某个输入域的子集合。在该子集合中,所有的输入数据对于揭露软件中的错误都是等效的。
全栈程序员站长
2022/07/01
1.2K0
黑盒测试用例测试方法
等价类划分法设计测试用例例题_有效等价类测试用例
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/02
6210
等价类划分法设计测试用例例题_有效等价类测试用例
什么是 Java 对象深拷贝?面试必问!
浅拷贝只是拷贝了源对象的地址,所以源对象的值发生变化时,拷贝对象的值也会发生变化。
Java技术栈
2019/09/16
9420
什么是 Java 对象深拷贝?面试必问!
测试用例设计方法
等价类划分 是把所有可能输入的数据分为若干个区域,然后从每个区域中取少量有代表性的数据进行测试即可。
花落花相惜
2021/11/26
6440
软件测试(测试用例)—写用例无压力
主要分享测试的学习资源,帮助快速了解测试行业,帮助想转行、进阶、小白成长为高级测试工程师。
伤心的辣条
2022/12/14
1.3K0
软件测试(测试用例)—写用例无压力
软件测试用例编写方法_软件测试用例包括
HttpRunner v3.x支持三种测试用例格式pytest,YAML和JSON。官方强烈建议以pytest格式而不是以前的YAML/JSON格式编写和维护测试用例 格式关系如下图所示:
全栈程序员站长
2022/09/19
7540
软件测试用例编写方法_软件测试用例包括
【测试】黑盒测试用例设计方法
等价类划分法是把程序的输入域划分成若干部分(子集),然后从每个部分中选取少数代表性数据作为测试用例。每一类的代表性数据在测试中的作用等价于这一类中的其他值。
全栈程序员站长
2022/08/10
2K0
【测试】黑盒测试用例设计方法
等价类测试用例设计原则_边界值法测试用例
   等价类划分法是黑盒测试中非常重要的测试方法,采用等价类划分法时,无需考虑程序内部结构,设计测试用例是依据游戏策划案进行设计的
全栈程序员站长
2022/11/02
9080
等价类划分法测试用例举例_使用等价类划分法设计测试用例
是在测试执行之前,由测试人员进行编写的指导测试过程的重要文档,主要包括:用例编号,测试目的,测试步骤(用例描述),预期结果(期待结果)等(不同公司模板不同,但是大同小异)
全栈程序员站长
2022/09/27
5890
软件测试用例编写方法_接口测试用例设计思路
HttpRunner v3.x支持三种测试用例格式pytest,YAML和JSON。官方强烈建议以pytest格式而不是以前的YAML/JSON格式编写和维护测试用例 格式关系如下图所示:
全栈程序员站长
2022/09/19
5990
软件测试用例编写方法_接口测试用例设计思路
常用八大测试用例设计方法有哪些_测试用例编写方法
1、等价类划分(Equivalance Partitioning)测试的思想:将程序的输入域划分为若干个区域(等价类),并在每个等价类中选择一个具有代表性的元素生成测试用例。该方法是常用的黑盒(Blackbox Testing)测试用例(Testcase)设计方法。
全栈程序员站长
2022/11/04
2.8K0
常用八大测试用例设计方法有哪些_测试用例编写方法
设计测试用例的方法
(1)有限的时间内测试,保证用户经常使用(使用频率比较高,主要的,核心的功能)功能的质量。 (2)如果有限的时间所有的功能不能完全测完,可以和产品经理开发商量,把没有通过测试的,有风险的功能把用户的入口,屏蔽掉(让用户无法使用),产生错误风险就会降低。 (3)本次测试,测试报告写清楚,这次上线,哪些功能测试了,哪些功能没有测试,上线风险分析清楚。
全栈程序员站长
2022/08/31
5480
设计测试用例的方法
初尝 Jest 单元测试
最近的几次发布都犯了小错,都是缺乏或者忽视了测试所导致的。通常来说,一个新功能上线的时候,开发和测试都投入比较多,各项测试都是比较全面的。然而,发布上线也并非意味着不再有bug或者修改。那这时候问题来了,有些修改, 我们会以为很简单,从而放松警惕,偷懒也罢,没有精力也罢,简单验证之后便匆匆发布了。此时,有可能不经意的改动对其它功能造成了影响,bug复bug, bug何其多呀。
IMWeb前端团队
2019/12/04
1.6K0
软件测试用例的设计方法_设计测试用例的依据
把程序的输入域和输出域划分成若干部分,然后从各个部分中选取若干代表性数据作为测试用例。这些数据在测试中的作用等价于其所属部分的其他值。
全栈程序员站长
2022/11/07
9770
软件测试用例的设计方法_设计测试用例的依据
初尝 Jest 单元测试
最近的几次发布都犯了小错,都是缺乏或者忽视了测试所导致的。通常来说,一个新功能上线的时候,开发和测试都投入比较多,各项测试都是比较全面的。然而,发布上线也并非意味着不再有bug或者修改。那这时候问题来
IMWeb前端团队
2017/12/29
1.8K0
初尝 Jest 单元测试
JUnit4:在测试用例中用FixMethodOrder指定测试方法的执行顺序
2018/09/30补记:感谢评论的指正,@FixMethodOrder的顺序也并不一定是方法在代码中定义的顺序,这与JVM的实现有关,我猜在class中方法名是保存在一个map中,不同JVM对map的实现不同,导致并不一定是按代码定义顺序的。
10km
2022/05/07
7840
JUnit4:在测试用例中用FixMethodOrder指定测试方法的执行顺序
黑盒测试用例设计方法二
定义:分析和表述若干输入条件下,被测对象对这些输入作出相应的一种表格。在遇到复杂业务逻辑时可以用该表理清业务逻辑关系。
吾非同
2020/10/23
5140

相似问题

无测试用例的超级JUnit类

10

如何在ObjectMapper序列化类时忽略属性

13

为方法编写NUnit测试用例

14

如何为无参数方法自动生成测试用例?

12

Rspec -测试用类名调用模块方法的类方法

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文