1
+ package com .github .binarywang .wxpay .bean .marketing ;
2
+
3
+ import com .github .binarywang .wxpay .bean .result .BaseWxPayV3Result ;
4
+ import com .google .gson .Gson ;
5
+ import com .google .gson .GsonBuilder ;
6
+ import com .google .gson .JsonElement ;
7
+ import com .google .gson .JsonParser ;
8
+ import org .testng .annotations .Test ;
9
+
10
+ import static org .testng .Assert .*;
11
+
12
+ /**
13
+ * 测试FavorStocksGetResult的原始JSON保存功能
14
+ *
15
+ * @author Binary Wang
16
+ */
17
+ public class FavorStocksGetResultTest {
18
+
19
+ private static final Gson GSON = new GsonBuilder ().create ();
20
+
21
+ @ Test
22
+ public void testRawJsonPreservation () {
23
+ // 模拟微信API返回的JSON(包含未在Result类中定义的字段)
24
+ String mockJson = "{\n " +
25
+ " \" stock_id\" : \" 9836588\" ,\n " +
26
+ " \" stock_creator_mchid\" : \" 1230000109\" ,\n " +
27
+ " \" stock_name\" : \" 微信支付代金券\" ,\n " +
28
+ " \" status\" : \" running\" ,\n " +
29
+ " \" create_time\" : \" 2021-01-01T00:00:00.000+08:00\" ,\n " +
30
+ " \" description\" : \" 微信支付营销\" ,\n " +
31
+ " \" card_id\" : \" pFS7Fjg9kqcMOBtl3bFn\" ,\n " +
32
+ " \" extra_field\" : \" 这是一个新增字段\" \n " +
33
+ "}" ;
34
+
35
+ // 模拟服务调用:反序列化JSON
36
+ FavorStocksGetResult result = GSON .fromJson (mockJson , FavorStocksGetResult .class );
37
+
38
+ // 模拟服务调用:设置原始JSON
39
+ result .setRawJsonString (mockJson );
40
+
41
+ // 验证基本字段正常解析
42
+ assertEquals (result .getStockId (), "9836588" );
43
+ assertEquals (result .getStockCreatorMchId (), "1230000109" );
44
+ assertEquals (result .getStockName (), "微信支付代金券" );
45
+ assertEquals (result .getStatus (), "running" );
46
+
47
+ // 验证原始JSON被保存
48
+ assertNotNull (result .getRawJsonString ());
49
+ assertEquals (result .getRawJsonString (), mockJson );
50
+
51
+ // 验证可以从原始JSON中获取未定义的字段
52
+ assertTrue (result .getRawJsonString ().contains ("\" card_id\" : \" pFS7Fjg9kqcMOBtl3bFn\" " ));
53
+ assertTrue (result .getRawJsonString ().contains ("\" extra_field\" : \" 这是一个新增字段\" " ));
54
+ }
55
+
56
+ @ Test
57
+ public void testBaseV3ResultInheritance () {
58
+ FavorStocksGetResult result = new FavorStocksGetResult ();
59
+
60
+ // 验证继承关系
61
+ assertTrue (result instanceof BaseWxPayV3Result );
62
+
63
+ // 验证基类方法可用
64
+ result .setRawJsonString ("test json" );
65
+ assertEquals (result .getRawJsonString (), "test json" );
66
+ }
67
+
68
+ @ Test
69
+ public void testNullRawJson () {
70
+ FavorStocksGetResult result = new FavorStocksGetResult ();
71
+
72
+ // 验证初始状态下rawJsonString为null
73
+ assertNull (result .getRawJsonString ());
74
+
75
+ // 验证设置null不会出错
76
+ result .setRawJsonString (null );
77
+ assertNull (result .getRawJsonString ());
78
+ }
79
+
80
+ @ Test
81
+ public void testRealWorldUsagePattern () {
82
+ // 实际使用场景的示例
83
+ String realApiResponse = "{\n " +
84
+ " \" stock_id\" : \" 9836588\" ,\n " +
85
+ " \" stock_creator_mchid\" : \" 1230000109\" ,\n " +
86
+ " \" stock_name\" : \" 微信支付代金券\" ,\n " +
87
+ " \" status\" : \" running\" ,\n " +
88
+ " \" create_time\" : \" 2021-01-01T00:00:00.000+08:00\" ,\n " +
89
+ " \" description\" : \" 微信支付营销\" ,\n " +
90
+ " \" card_id\" : \" pFS7Fjg9kqcMOBtl3bFn\" ,\n " +
91
+ " \" future_field_1\" : \" 未来可能新增的字段1\" ,\n " +
92
+ " \" future_field_2\" : \" 未来可能新增的字段2\" \n " +
93
+ "}" ;
94
+
95
+ FavorStocksGetResult result = GSON .fromJson (realApiResponse , FavorStocksGetResult .class );
96
+ result .setRawJsonString (realApiResponse );
97
+
98
+ // 1. 正常使用已定义的字段
99
+ assertEquals (result .getStockId (), "9836588" );
100
+ assertEquals (result .getStockName (), "微信支付代金券" );
101
+
102
+ // 2. 安全地获取可能存在的新字段
103
+ String cardId = getStringFieldSafely (result , "card_id" );
104
+ assertEquals (cardId , "pFS7Fjg9kqcMOBtl3bFn" );
105
+
106
+ // 3. 获取未来可能新增的字段
107
+ String futureField1 = getStringFieldSafely (result , "future_field_1" );
108
+ assertEquals (futureField1 , "未来可能新增的字段1" );
109
+
110
+ String nonExistentField = getStringFieldSafely (result , "non_existent" );
111
+ assertNull (nonExistentField );
112
+ }
113
+
114
+ @ Test
115
+ public void testCardIdExtractionExample () {
116
+ // 测试具体的card_id字段提取(这是issue中提到的用例)
117
+ String apiResponseWithCardId = "{\n " +
118
+ " \" stock_id\" : \" 9836588\" ,\n " +
119
+ " \" stock_creator_mchid\" : \" 1230000109\" ,\n " +
120
+ " \" stock_name\" : \" 微信支付代金券\" ,\n " +
121
+ " \" status\" : \" running\" ,\n " +
122
+ " \" card_id\" : \" pFS7Fjg9kqcMOBtl3bFn\" \n " +
123
+ "}" ;
124
+
125
+ FavorStocksGetResult result = GSON .fromJson (apiResponseWithCardId , FavorStocksGetResult .class );
126
+ result .setRawJsonString (apiResponseWithCardId );
127
+
128
+ // 验证可以获取card_id字段
129
+ JsonElement jsonElement = JsonParser .parseString (result .getRawJsonString ());
130
+ assertTrue (jsonElement .getAsJsonObject ().has ("card_id" ));
131
+ String cardId = jsonElement .getAsJsonObject ().get ("card_id" ).getAsString ();
132
+ assertEquals (cardId , "pFS7Fjg9kqcMOBtl3bFn" );
133
+
134
+ // 展示实际用法
135
+ String extractedCardId = extractCardId (result );
136
+ assertEquals (extractedCardId , "pFS7Fjg9kqcMOBtl3bFn" );
137
+ }
138
+
139
+ /**
140
+ * 提取card_id的示例方法
141
+ */
142
+ private String extractCardId (FavorStocksGetResult result ) {
143
+ return getStringFieldSafely (result , "card_id" );
144
+ }
145
+
146
+ /**
147
+ * 安全地从结果中获取字符串字段的工具方法
148
+ */
149
+ private String getStringFieldSafely (BaseWxPayV3Result result , String fieldName ) {
150
+ String rawJson = result .getRawJsonString ();
151
+ if (rawJson == null ) return null ;
152
+
153
+ try {
154
+ JsonElement jsonElement = JsonParser .parseString (rawJson );
155
+ if (jsonElement .getAsJsonObject ().has (fieldName )) {
156
+ JsonElement fieldElement = jsonElement .getAsJsonObject ().get (fieldName );
157
+ return fieldElement .isJsonNull () ? null : fieldElement .getAsString ();
158
+ }
159
+ } catch (Exception e ) {
160
+ // 解析失败时返回null
161
+ }
162
+ return null ;
163
+ }
164
+ }
0 commit comments