[英]Java - How to unit test main method dependencies?
在這里對主要方法進行單元測試的正確方法是什么? 理想情況下,我只想驗證SomeProgram的(模擬)實例在main方法內部調用了run()方法。 我知道我可以創建一個setter來設置SomeProgram的實例,但是它看起來像是一種代碼氣味,因為它除了啟用更容易的測試之外沒有做任何其他事情? 與run()方法上的公共訪問器相同。 測試目的是自由的。 如果它是私人的,我該如何測試? 我正在尋找對類的更改,也許應用一些設計模式來緩解此問題。
public class SomeProgram {
public void run(Dependency1 dependency1, Dependency2 dependency2) {
dependency1.doSomething();
dependency2.doSomething();
}
public static void main(String[] args) {
new SomeProgram().run(new Dependency1(), new Dependency2());
}
}
沒有對main
方法進行單元測試的有用方法。 通常,這些方法會初始化對象圖(或顯式調用諸如Spring或Guice這樣的DI容器來這樣做),因此您最終沒有任何真正有用的測試接縫可以直接注入模擬或偽造品。
您可以做的就是使用集成測試。 您可以設置集成環境並配置main方法以指向受測試控制的對象。 因此,例如,如果您的程序與數據庫對話,則您的測試可以啟動嵌入式數據庫,並使用命令行參數將程序指向嵌入式數據庫,而不是外部數據庫。 您可以使用嵌入式Jetty類似地偽造外部Rest API。
但是重要的是要接受這些將不是單元測試。 它們將是集成測試,並且會遇到通常與集成測試相關聯的問題-它們比單元測試慢,並且您對系統的控制較少,因此測試某些東西可能會很棘手。
測試程序的功能,而不是程序本身。
您可以通過利用依賴注入來做到這一點。 如果Dependency1是接口而不是具體的類,則此方法效果最好。
public class SomeProgram
{
private final Dependency1 _dependency1;
private final Dependency2 _dependency2;
public SomeProgram(Dependency1 dependency1, Dependency2 dependency2)
{
_dependency1 = dependency1;
_dependency2 = dependency2;
}
public void run()
{
dependency1.doSomething();
dependency2.doSomething();
}
}
然后,您的主要方法將與單元測試完全一樣,不同之處在於它將注入真正的依賴項。
public static void main(String[] args)
{
new SomeProgram(new Dependency1(), new Dependency2()).run();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.