Standart yolu:
@RestController
public class Main {
UserService userService;
public Main(){
userService = new UserServiceImpl();
}
@GetMapping("/")
public String index(){
return userService.print("Example test");
}
}
Kullanıcı servis arayüzü:
public interface UserService {
String print(String text);
}
UserServiceImpl sınıfı:
public class UserServiceImpl implements UserService {
@Override
public String print(String text) {
return text + " UserServiceImpl";
}
}
Çıktı: Example test UserServiceImpl
Bu sıkı birleştirilmiş sınıfların, kötü tasarım örneklerinin harika bir örneğidir ve test ile ilgili bir sorun olacaktır (PowerMockito da kötüdür).
Şimdi SpringBoot bağımlılık enjeksiyonuna bir göz atalım, gevşek bağlantıya güzel bir örnek:
Arayüz aynı kalır,
Ana sınıf:
@RestController
public class Main {
UserService userService;
@Autowired
public Main(UserService userService){
this.userService = userService;
}
@GetMapping("/")
public String index(){
return userService.print("Example test");
}
}
ServiceUserImpl sınıfı:
@Component
public class UserServiceImpl implements UserService {
@Override
public String print(String text) {
return text + " UserServiceImpl";
}
}
Çıktı: Example test UserServiceImpl
ve şimdi testi yazmak kolaydır:
@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");
}
}
Yapıcıya @Autowired
ek açıklama gösterdim ancak ayarlayıcı veya sahada da kullanılabilir.