Cara standar:
@RestController
public class Main {
UserService userService;
public Main(){
userService = new UserServiceImpl();
}
@GetMapping("/")
public String index(){
return userService.print("Example test");
}
}
Antarmuka layanan pengguna:
public interface UserService {
String print(String text);
}
Kelas UserServiceImpl:
public class UserServiceImpl implements UserService {
@Override
public String print(String text) {
return text + " UserServiceImpl";
}
}
Keluaran: Example test UserServiceImpl
Itu adalah contoh yang bagus dari kelas berpasangan ketat, contoh desain yang buruk dan akan ada masalah dengan pengujian (PowerMockito juga buruk).
Sekarang mari kita lihat injeksi ketergantungan SpringBoot, contoh yang bagus dari kopling longgar:
Antarmuka tetap sama,
Kelas utama:
@RestController
public class Main {
UserService userService;
@Autowired
public Main(UserService userService){
this.userService = userService;
}
@GetMapping("/")
public String index(){
return userService.print("Example test");
}
}
Kelas ServiceUserImpl:
@Component
public class UserServiceImpl implements UserService {
@Override
public String print(String text) {
return text + " UserServiceImpl";
}
}
Keluaran: Example test UserServiceImpl
dan sekarang mudah untuk menulis tes:
@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");
}
}
Saya menunjukkan @Autowired
anotasi pada konstruktor tetapi juga dapat digunakan pada setter atau bidang.