मैं एक साधारण वसंत वेब एप्लिकेशन के लिए कुछ सरल यूनिट परीक्षण दिनचर्या लिख रहा हूं। जब मैं किसी संसाधन के गेटटर विधि पर @JsonIgnore एनोटेशन जोड़ता हूं, परिणामी जेसन ऑब्जेक्ट में संबंधित जेसन तत्व शामिल नहीं होता है। तो जब मेरी यूनिट टेस्ट रूटीन परीक्षण करने की कोशिश करती है कि यह शून्य है (जो मेरे मामले के लिए अपेक्षित व्यवहार है, मैं नहीं चाहता कि पासवर्ड जेसन ऑब्जेक्ट में उपलब्ध हो), परीक्षण नियमित रूप से अपवाद में चलता है:परीक्षण कैसे करें यदि JSON पथ में कोई विशिष्ट तत्व शामिल नहीं है, या यदि तत्व मौजूद है तो यह शून्य है?
java.lang.AssertionError: No value for JSON path: $.password, exception: No results for path: $['password']
@Test
public void getUserThatExists() throws Exception {
User user = new User();
user.setId(1L);
user.setUsername("zobayer");
user.setPassword("123456");
when(userService.getUserById(1L)).thenReturn(user);
mockMvc.perform(get("https://stackoverflow.com/users/1"))
.andExpect(jsonPath("$.username", is(user.getUsername())))
.andExpect(jsonPath("$.password", is(nullValue())))
.andExpect(jsonPath("$.links[*].href", hasItem(endsWith("https://stackoverflow.com/users/1"))))
.andExpect(status().isOk())
.andDo(print());
}
मैं भी jsonPath() मौजूद है() जो समान अपवाद हो जाता है के साथ यह कोशिश की है:।
इस इकाई परीक्षा पद्धति मैंने लिखा, साथ 'पासवर्ड' क्षेत्र परीक्षण कर रहा है (nullValue()) विधि है यह बताते हुए कि पथ मौजूद नहीं है। मैं कुछ और कोड स्निपेट साझा कर रहा हूं ताकि पूरी स्थिति अधिक पठनीय हो जाए।
नियंत्रक विधि मैं परीक्षण कर रहा हूँ इस तरह दिखता है:
@RequestMapping(value="https://stackoverflow.com/users/{userId}", method= RequestMethod.GET)
public ResponseEntity<UserResource> getUser(@PathVariable Long userId) {
logger.info("Request arrived for getUser() with params {}", userId);
User user = userService.getUserById(userId);
if(user != null) {
UserResource userResource = new UserResourceAsm().toResource(user);
return new ResponseEntity<>(userResource, HttpStatus.OK);
} else {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
}
मैं वसंत hateos संसाधन कोडांतरक उपयोग कर रहा हूँ इकाई परिवर्तित वस्तुओं संसाधन के लिए और यह मेरा संसाधन वर्ग है:
public class UserResource extends ResourceSupport {
private Long userId;
private String username;
private String password;
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@JsonIgnore
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
मैं समझें कि यह अपवाद क्यों प्राप्त कर रहा है, एक तरह से, परीक्षण सफल है कि इसे पासवर्ड फ़ील्ड नहीं मिला। लेकिन मैं क्या करना चाहता हूं, यह सुनिश्चित करने के लिए कि यह क्षेत्र मौजूद नहीं है, या यदि मौजूद है, तो इसमें शून्य मान शामिल है। इसे कैसे प्राप्त किया जा सकता है?
वहाँ ढेर अतिप्रवाह में एक ऐसी ही पोस्ट है: Hamcrest with MockMvc: check that key exists but value may be null
मेरे मामले में, क्षेत्र गैर विद्यमान रूप में अच्छी तरह हो सकता है।
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.6.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.6.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.6.1</version>
</dependency>
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>2.0.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path-assert</artifactId>
<version>2.0.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.10.19</version>
<scope>test</scope>
</dependency>
अग्रिम धन्यवाद:
रिकॉर्ड के लिए, इन मैं उपयोग कर रहा हूँ परीक्षण संकुल की संस्करण हैं।
[संपादित करें] अधिक सटीक होने के लिए, आपको एक इकाई के लिए एक परीक्षा लिखनी है जहां आप जानते हैं कि कुछ क्षेत्रों को शून्य या खाली होना चाहिए या यहां तक कि अस्तित्व में नहीं होना चाहिए, और आप वास्तव में नहीं जाते कोड के माध्यम से यह देखने के लिए कि संपत्ति के शीर्ष पर एक जेसन इग्नोर जोड़ा गया है या नहीं। और आप अपने परीक्षण पास करना चाहते हैं, मैं यह कैसे कर सकता हूं।
कृपया मुझे यह बताने में संकोच न करें कि यह बिल्कुल व्यावहारिक नहीं है, लेकिन अभी भी जानना अच्छा होगा।
[संपादित करें] ऊपर परीक्षण निम्नलिखित पुराने json-पथ निर्भरता के साथ सफल होता है:
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>0.9.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path-assert</artifactId>
<version>0.9.1</version>
<scope>test</scope>
</dependency>
[संपादित करें] वसंत के json के प्रलेखन पढ़ने के बाद एक QuickFix कि jayway.jasonpath के नवीनतम संस्करण के साथ काम करता मिला पथ matcher।
.andExpect(jsonPath("$.password").doesNotExist())
आपके अंतिम "संपादन" के लिए धन्यवाद। '.doesNotExist() 'मैं जो खोज रहा था वह था। – James