String Hamcrest断言由于对象值数组中的unicode字符“'\u200E”8206”,equalTo失败

String Hamcrest断言由于对象值数组中的unicode字符“'\u200E”8206”,equalTo失败,string,hamcrest,assertthat,String,Hamcrest,Assertthat,我在测试中使用Hamcrest进行断言。下面的代码段适用于其他字符串比较,但是下面的语句失败,因为对象值数组中第0位有一些随机字符,如下图所示 assertThat("failure, Publication did not match", book.getPublication(), is("Bloomsbury Publishing")); 结果如下: java.lang.AssertionError: failure, Publication did not match Expected

我在测试中使用Hamcrest进行断言。下面的代码段适用于其他字符串比较,但是下面的语句失败,因为对象值数组中第0位有一些随机字符,如下图所示

assertThat("failure, Publication did not match", book.getPublication(), is("Bloomsbury Publishing"));
结果如下:

java.lang.AssertionError: failure, Publication did not match
Expected: is "Bloomsbury Publishing"
     but: was "‎Bloomsbury Publishing"
Expected :Bloomsbury Publishing
Actual   :‎Bloomsbury Publishing
如果有帮助的话,Book是Product entity中的一个扩展JPA实体,其中Product具有注释@heritance strategy=InheritanceType.JOINED

产品类别

图书班

在data.sql中的测试数据中,我有:

INSERT INTO PRODUCT(ID, PROD_NAME, PRICE) VALUES (1, 'Harry Potter', 200.55);
INSERT INTO PRODUCT(ID, PROD_NAME, PRICE) VALUES (2, 'Chhawa', 450.45);
INSERT INTO PRODUCT(ID, PROD_NAME, PRICE) VALUES (3, 'Chatrapati Shivaji Maharaj', 1000.00);
INSERT INTO PRODUCT(ID, PROD_NAME, PRICE) VALUES (4, 'Asa Mi Asami', 99.99);
INSERT INTO BOOK(ID, GENRE, AUTHOR, PUBLICATION) VALUES (1, 'Contemporary Fantasy', 'J. K. Rollings', '‎Bloomsbury Publishing');
INSERT INTO BOOK(ID, GENRE, AUTHOR, PUBLICATION) VALUES (2, 'Action', 'Shivaji Savant', 'Mehta Publishing House');
INSERT INTO BOOK(ID, GENRE, AUTHOR, PUBLICATION) VALUES (3, 'Action', 'Krishanrao Arjun Kelusakar', 'Saraswati Publishing Co.Pvt.Ltd');
INSERT INTO BOOK(ID, GENRE, AUTHOR, PUBLICATION) VALUES (4, 'Comedy', 'Pu La Deshpande', 'SANSKRUTI BOOK HOUSE');
我正在解压@GetMappingpath=/products/{id}返回的json,如下所示:

奇怪的是,我得到的这个“\u200E”8206 unicode字符仅用于ID=1

以下是指向整个代码库的链接:
第一个字符是Unicode从左到右的标记:

您可以使用character类将该字符替换为Java正则表达式支持:

"\\p{C}"
也就是说,如果你认为这个测试应该通过。如果你认为,在你的分析之后,它应该失败,那么结果确实失败了。Book类还可以在其getPublication getter中返回一个带有剥离Unicode标点的字符串,如果可以修改此getter,则可以使用正则表达式replaceAll


另请参见维基百科控制字符。顺便说一句,这是一个控制字符。

谢谢@user176692。我只是将JSON响应体解封送到Book对象。这个字符存在于json响应中,因此为什么也会进入这个Book对象。现在,我来看看为什么unicode字符首先会出现在json响应中?即使它是Unicode类型,即nchar,也不明白为什么它会自己从左向右插入。好奇这个字符是否在数据库中。如果你混合了从左到右的语言和从右到左的语言,比如希伯来语和波斯语,这会很有用。这都是英语字符,所以我不认为有任何理由让这个字符出现。发布的类型为String。我正在使用H2数据库进行测试,我看不到那个字符。不确定这是否重要,但data.sql是以UTF-8编码保存的。我试图将带有引号的布鲁姆斯伯里出版社的信件复制到Visual Studio中,我得到了“此文件中的某些Unicode字符无法保存…”。。。警告也许以ANSI格式重新保存或以ANSI格式重新写入会阻止他们输入H2?只是一个想法。
INSERT INTO PRODUCT(ID, PROD_NAME, PRICE) VALUES (1, 'Harry Potter', 200.55);
INSERT INTO PRODUCT(ID, PROD_NAME, PRICE) VALUES (2, 'Chhawa', 450.45);
INSERT INTO PRODUCT(ID, PROD_NAME, PRICE) VALUES (3, 'Chatrapati Shivaji Maharaj', 1000.00);
INSERT INTO PRODUCT(ID, PROD_NAME, PRICE) VALUES (4, 'Asa Mi Asami', 99.99);
INSERT INTO BOOK(ID, GENRE, AUTHOR, PUBLICATION) VALUES (1, 'Contemporary Fantasy', 'J. K. Rollings', '‎Bloomsbury Publishing');
INSERT INTO BOOK(ID, GENRE, AUTHOR, PUBLICATION) VALUES (2, 'Action', 'Shivaji Savant', 'Mehta Publishing House');
INSERT INTO BOOK(ID, GENRE, AUTHOR, PUBLICATION) VALUES (3, 'Action', 'Krishanrao Arjun Kelusakar', 'Saraswati Publishing Co.Pvt.Ltd');
INSERT INTO BOOK(ID, GENRE, AUTHOR, PUBLICATION) VALUES (4, 'Comedy', 'Pu La Deshpande', 'SANSKRUTI BOOK HOUSE');
ResponseEntity<Book> response = restTemplate.exchange(
        productBaseUrl,
        HttpMethod.GET,
        null,
        Book.class);

Book book = response.getBody();
"\\p{C}"