同事們,我歡迎你們!告訴我如何決定,或如何行動。(Java11, SpringBoot, testing - Spock Framework) 我需要寫一個測驗來測驗一個類的方法,整個問題是被測類的方法通過繼承呼叫另一個服務,在被測類中沒有宣告,但在它的抽象祖先中。如何測驗這樣的故事?如果這個服務是在被測類本身中宣告的,那么一切都清楚了,我會在測驗中創建一個模擬并將它傳遞給建構式,但是如果這個服務位于祖先呢?我在下面附上了一個示例代碼。
// The class to be tested
@Service
public class ServiceForTest extends AbstractComponent{
public String methodForTest (String s) {
return someService.generateString(s);
}
}
//An abstract class from which the tested one is inherited and which contains the service
public class AbstractComponent {
@Autowired
protected SomeService someService;
}
public interface SomeService {
String generateString(String s);
}
@Service
public class SomeServiceImpl implements SomeService{
@Override
public String generateString(String s) {
return s;
}
}
下面是一個例子,如果服務在被測驗的類中我會做什么
//TestClass
@Service
public class ServiceForTest extends AbstractComponent{
final SomeService someService;
public ServiceForTest(SomeService someService) {
this.someService = someService;
}
public String methodForTest (String s) {
return someService.generateString(s);
}
}
類測驗 groovy,Spock 框架
class ServiceForTestTest extends Specification {
ServiceForTest serviceForTest
void setup(){
SomeService someServiceMock = Mock(SomeService)
someServiceMock.generateString("TEST") >> "TEST"
serviceForTest = new ServiceForTest(someServiceMock)
}
def "Test for return current value"(){
when:
def methodForTest = serviceForTest.methodForTest("TEST")
then:
methodForTest == "TEST"
}
}
uj5u.com熱心網友回復:
您使用@Autowired,即某種依賴注入框架,例如 Spring 或 Java EE CDI。這些框架具有測驗支持。專門用于 Spring 測驗,Spock 有一個可以使用的Spring 模塊。我不是 Spring 用戶,所以我不能告訴你具體怎么做,但是檔案非常好。
作為一般答案,即使沒有任何框架支持,如果您按照約定將測驗放入與被測類相同的包中,您也可以輕松測驗它。因為要注入模擬的欄位是protected,所以對于 JVM 來說,這意味著所有子類以及同一包中的其他類都可以訪問它。即,您可以簡單地設定值:
serviceForTest = new ServiceForTest()
serviceForTest.someService = someServiceMock
或者,更優雅地使用隱式設定欄位值的 Groovy 風格的建構式:
serviceForTest = new ServiceForTest(someService: someServiceMock)
通常,我推薦建構式或 setter 注入,而不是依賴欄位注入(尤其是當欄位是私有的時),因為在可測驗性方面,您對 DI 框架有嚴格的依賴,并且不能輕易撰寫單元測驗。因此,如果您可以重構,我建議您這樣做。您剛剛注意到,測驗此類事情可能會讓人頭疼,除非您有出路,例如在受保護欄位的這種特殊情況下。但這并不是對重構非常友好。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/421463.html
標籤:
