我有一個工廠,返回一個接口FormatService
:我可以使用jmock替換工廠返回的實現嗎?
public class FormatServiceFactory {
public FormatService getService() {
...
}
}
是否可以模擬出這家工廠,以便它總是返回的FormatService
一個存根實現 - 在我們的單元測試FormatServiceStub
?
我有一個工廠,返回一個接口FormatService
:我可以使用jmock替換工廠返回的實現嗎?
public class FormatServiceFactory {
public FormatService getService() {
...
}
}
是否可以模擬出這家工廠,以便它總是返回的FormatService
一個存根實現 - 在我們的單元測試FormatServiceStub
?
取決於。工廠如何獲得/使用被測試的代碼?
如果它在您正在測試的方法中顯式實例化,或者它是靜態工廠,那麼您將無法嘲笑它。
如果它被注入到被測對象中,您可以在執行測試之前創建並注入模擬工廠。
用JMock嘲笑工廠應該很容易。從您的示例代碼看,它看起來像是一個類,而不是接口,因此您需要使用cglib版本的JMock和用於JMock 1的cglib包中的MockObjectTestCase類,或者用於JMock 2的ClassImposteriser。
一旦被嘲笑,當你定義getService()方法的期望時,你可以讓它返回你的stubbed實現(甚至是一個mock FormatService)。
Mockery mockery = new JUnit4Mockery(){{setImposteriser(ClassImposteriser.INSTANCE);}};
final FormatServiceFactory factory = mockery.mock(FormatServiceFactory.class); (new)期望值(){{ oneOf(factory).getService(); will(returnValue(new FormatServiceMock())); }});