sql 注射_令人惊讶的注射
sql 注射
所以,我欠吉姆道歉。 他編寫了一個有效的模擬和JUnit測試,我在回顧中告訴他,我認為它沒有達到他的預期。 當我錯了時,這種情況對我來說就像是一個錯誤 。 稱它為理想的意外副作用。
假設您有以下兩類:
public class Service { private String name; private Widget widget; public Service(String name, Widget widget) { this .name = name; this .widget = widget; } public void execute() { widget.handle(name); } } public interface Widget { void handle(String thing); }那里沒什么令人興奮的…
現在,讓我們嘗試使用Mockito測試(此處為JUnit 5)測試服務:
@ExtendWith (MockitoExtension. class ) class ServiceTest { @Mock private Widget widget; @InjectMocks private Service service = new Service( "Joe" , widget); @Test void foo() { service.execute(); verify(widget).handle( "Joe" ); } }測試通過。 但是應該嗎?
對我來說, @InjectMocks批注旨在作為一種工廠方法來創建依賴于模擬值的東西,在測試中使用@Mock表示。 這就是我通常使用的方式,并且我也希望生態系統中的所有對象都是使用構造函數注入構建的。
這是一個很好的設計原則,但不是工具功能的定義!
應用此批注的外觀與在注釋字段的過程@InjectMocks ,并采取不同的路徑,如果它的null比,如果它已經初始化。 對于null路徑是一種聲明式構造函數注入方法如此純粹,我完全不認為注入模擬可能意味著對現有對象執行此操作。 該文檔也不太清楚這一點。
- 如果沒有對象,則@InjectMocks必須創建一個
- 它使用可以提供的最大構造函數
- 如果有一個對象,它將嘗試通過setters來填充模擬
- 如果沒有設置器,它會嘗試通過直接設置字段來強制破解模擬,迫使它們一路被訪問
最重要的是, @InjectMocks靜默@InjectMocks失敗,因此您可能會在不知道的情況下進行神秘的測試失敗。
更重要的是,有些人在Mockito Runner頂部的測試中使用MockitoAnnotations.initMocks()調用,這會導致各種奇怪的事情!!! 認真的家伙,永遠不要打電話。
得到教訓
呃,對不起,吉姆!
@InjectMocks注釋確實會盡其所能執行最有用的操作,但是場景越復雜,預測就越困難。
在我看來,使用兩種橫切技術初始化對象是一種危險且難以理解的方法,但是,如果有記錄的話,它可能比其他方法更好。 添加評論!
也許需要某種@InjectWithFactory ,您可以在其中聲明一個接收所需@InjectWithFactory的方法,并在構造時使用@Mock對象調用該方法,以便您填充其余測試上下文中的任何其他參數。
或者,也許我們只是習慣了這項工作,而忘記了它是否易于理解。
最終思想
我通過創建測試并調試Mockito庫以找到其實現結果的方法,了解了Mockito在上面所做的工作。 我強烈建議您以這種方式瀏覽您最常用的庫。 您將學到一些有用的東西!
翻譯自: https://www.javacodegeeks.com/2019/11/a-surprising-injection.html
sql 注射
總結
以上是生活随笔為你收集整理的sql 注射_令人惊讶的注射的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 邮件 tls_通过TLS发送的
- 下一篇: html模板怎么查看(html查询页面模