我想單元測試調用類「B」的靜態方法的類「A」。 'B'類本質上有一個谷歌guava緩存,它從緩存中獲取一個給定密鑰的值(對象),或者使用服務適配器將對象加載到緩存中(如果緩存未命中)。服務適配器類又具有其他自動裝配的依賴關係來檢索對象。單元測試調用靜態方法的類
這些是類用於說明目的:
A類
public class A {
public Object getCachedObject(String key) {
return B.getObjectFromCache(key);
}
}
B類
public class B {
private ServiceAdapter serviceAdapter;
public void setServiceAdapter(ServiceAdapter serAdapt) {
serviceAdapter = serAdapt;
}
private static final LoadingCache<String, Object> CACHE = CacheBuilder.newBuilder()
.maximumSize(100)
.expireAfterWrite(30, TimeUnit.MINUTES)
.build(new MyCacheLoader());
public static Object getObjectFromCache(final String key) throws ExecutionException {
return CACHE.get(warehouseId);
}
private static class MyCacheLoader extends CacheLoader<String, Object> {
@Override
public Object load(final String key) throws Exception {
return serviceAdapter.getFromService(key)
}
}
}
服務的適配器類別
public class ServiceAdapter {
@Autowired
private MainService mainService
public Object getFromService(String key) {
return mainService.getTheObject(key);
}
}
我能夠做成功集成測試和提取(或負載)從(或到)高速緩存中的價值。但是,我不能寫單元測試類A.這是我曾嘗試:
單元測試A級
@RunWith(EasyMocker.class)
public class ATest {
private final static String key = "abc";
@TestSubject
private A classUnderTest = new A();
@Test
public void getCachedObject_Success() throws Exception {
B.setServiceAdapter(new ServiceAdapter());
Object expectedResponse = createExpectedResponse(); //some private method
expect(B.getObjectFromCache(key)).andReturn(expectedResponse).once();
Object actualResponse = classUnderTest.getCachedObject(key);
assertEquals(expectedResponse, actualResponse);
}
}
當我運行單元測試,它在調用mainService.getTheObject(key)的ServiceAdapter類中發生NullPointerException失敗。
如何嘲笑ServiceAdapter的依賴,而單元測試A級。我不應該只關注眼前的依賴類A有,即。 B.
我相信我做的事根本錯誤的。我應該如何編寫A班的單元測試?
你類'B'甚至沒有編譯 –
我只是想說明這些類是怎麼樣的。爲了說明的目的,我抽象了很多,這不是真正的類。 – user1639485
一般來說,如果你不得不嘲笑對靜態方法的調用,這意味着你的代碼編寫不正確,應該重寫爲可測試的,所以如果你想知道如何重寫代碼 –