मानक तरीका:
@RestController
public class Main {
UserService userService;
public Main(){
userService = new UserServiceImpl();
}
@GetMapping("/")
public String index(){
return userService.print("Example test");
}
}
उपयोगकर्ता सेवा इंटरफ़ेस:
public interface UserService {
String print(String text);
}
UserServiceImpl वर्ग:
public class UserServiceImpl implements UserService {
@Override
public String print(String text) {
return text + " UserServiceImpl";
}
}
आउटपुट: Example test UserServiceImpl
यह तंग युग्मित वर्गों, खराब डिजाइन उदाहरण का एक शानदार उदाहरण है और परीक्षण के साथ समस्या होगी (पावरमॉकिटो भी खराब है)।
अब स्प्रिंगबूट निर्भरता इंजेक्शन पर एक नज़र डालते हैं, ढीले युग्मन का अच्छा उदाहरण:
इंटरफ़ेस ही रहता है,
मुख्य वर्ग:
@RestController
public class Main {
UserService userService;
@Autowired
public Main(UserService userService){
this.userService = userService;
}
@GetMapping("/")
public String index(){
return userService.print("Example test");
}
}
ServiceUserImpl वर्ग:
@Component
public class UserServiceImpl implements UserService {
@Override
public String print(String text) {
return text + " UserServiceImpl";
}
}
आउटपुट: Example test UserServiceImpl
और अब परीक्षण लिखना आसान है:
@RunWith(MockitoJUnitRunner.class)
public class MainTest {
@Mock
UserService userService;
@Test
public void indexTest() {
when(userService.print("Example test")).thenReturn("Example test UserServiceImpl");
String result = new Main(userService).index();
assertEquals(result, "Example test UserServiceImpl");
}
}
मैंने @Autowired
निर्माणकर्ता पर एनोटेशन दिखाया, लेकिन इसे सेटर या फ़ील्ड पर भी उपयोग किया जा सकता है।