如何使用Google Truth比较Protocol Buffers与字符串?
使用Google Truth比较Protocol Buffers与字符串的方法
当然可以实现你想要的断言效果!Google Truth本身没有直接提供针对Protobuf的isEqualToString方法,但我们可以通过几个简单的方式达成目标,下面分场景给你讲讲具体做法:
场景1:严格验证Protobuf的文本输出格式
如果你需要确保Protobuf转换成的字符串和你指定的格式完全一致,可以直接把Protobuf对象转成字符串,再用Google Truth的字符串断言来对比:
Protobuf对象自带的toString()方法会生成类似键值对的文本输出,比如你的示例中,初始化好的myProto调用toString()后会输出"a: 1\n b: 2",这时候直接用Google Truth断言即可:
import com.google.common.truth.Truth; // 初始化你的Protobuf对象 MyMessage myProto = MyMessage.newBuilder() .setA(1) .setB(2) .build(); // 直接对比字符串 Truth.assertThat(myProto.toString()).isEqualTo("a: 1\n b: 2");
如果担心文本中的空格、换行这类细微差异影响断言结果,还可以用忽略空白的断言方法:
Truth.assertThat(myProto.toString()).isEqualToIgnoringWhitespace("a:1 b:2");
另外,你也可以用Protobuf官方的TextFormat类来生成更可控的文本输出,在处理嵌套字段、重复字段时格式会更规范:
import com.google.protobuf.TextFormat; String protoText = TextFormat.printer().print(myProto); Truth.assertThat(protoText).isEqualTo("a: 1\n b: 2");
场景2:只关心Protobuf内容是否一致(更推荐)
如果你不需要严格验证文本格式,只是想确认Protobuf的内容和字符串描述的一致,更可靠的做法是把目标字符串解析成Protobuf对象,再直接对比两个Protobuf实例:
import com.google.protobuf.TextFormat; // 把目标字符串解析成Protobuf对象 MyMessage.Builder expectedBuilder = MyMessage.newBuilder(); TextFormat.parse("a: 1\n b: 2", expectedBuilder); MyMessage expectedProto = expectedBuilder.build(); // 直接对比两个Protobuf对象 Truth.assertThat(myProto).isEqualTo(expectedProto);
这种方法的优势是完全不依赖文本格式的细节,即使字符串里的字段顺序和Protobuf定义的编号顺序不一样,只要内容一致就能断言通过,更适合大多数测试场景。
内容的提问来源于stack exchange,提问作者Mahmoud Refaat
相关产品推荐
相关产品推荐

